From: Tulio Magno Quites Machado Filho Date: Fri, 28 Oct 2016 20:31:24 +0000 (-0200) Subject: Document a behavior of an elided pthread_rwlock_unlock X-Git-Tag: glibc-2.25~361 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=739e14f9009ff91e4a8d01776e7269fc8cbd0293;p=thirdparty%2Fglibc.git Document a behavior of an elided pthread_rwlock_unlock Explain that pthread_rwlock_unlock may crash if called on a lock not held by the current thread. --- diff --git a/ChangeLog b/ChangeLog index 4f76008663f..d5b3f7bb7ec 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2016-10-28 Tulio Magno Quites Machado Filho + + * nptl/pthread_rwlock_unlock.c: Add a comment explaining its + behavior when eliding a lock not held by the current thread. + * sysdeps/powerpc/nptl/elide.h: Likewise. + 2016-10-28 Tulio Magno Quites Machado Filho [BZ #20728] diff --git a/nptl/pthread_rwlock_unlock.c b/nptl/pthread_rwlock_unlock.c index a6cadd491df..112f748a6b4 100644 --- a/nptl/pthread_rwlock_unlock.c +++ b/nptl/pthread_rwlock_unlock.c @@ -35,6 +35,10 @@ __pthread_rwlock_unlock (pthread_rwlock_t *rwlock) LIBC_PROBE (rwlock_unlock, 1, rwlock); + /* Trying to elide an unlocked lock may crash the process. This + is expected and is compatible with POSIX.1-2008: "results are + undefined if the read-write lock rwlock is not held by the + calling thread". */ if (ELIDE_UNLOCK (rwlock->__data.__writer == 0 && rwlock->__data.__nr_readers == 0)) return 0; diff --git a/sysdeps/powerpc/nptl/elide.h b/sysdeps/powerpc/nptl/elide.h index 77bd82ecba0..835fd92968d 100644 --- a/sysdeps/powerpc/nptl/elide.h +++ b/sysdeps/powerpc/nptl/elide.h @@ -102,6 +102,9 @@ __elide_unlock (int is_lock_free) { if (is_lock_free) { + /* This code is expected to crash when trying to unlock a lock not + held by this thread. More information is available in the + __pthread_rwlock_unlock() implementation. */ __libc_tend (0); return true; }