diff --git a/ChangeLog b/ChangeLog index 4f76008663..d5b3f7bb7e 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 a6cadd491d..112f748a6b 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 77bd82ecba..835fd92968 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; }