diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | nptl/pthread_rwlock_unlock.c | 4 | ||||
-rw-r--r-- | sysdeps/powerpc/nptl/elide.h | 3 |
3 files changed, 13 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog index 4f76008663..d5b3f7bb7e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2016-10-28 Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com> + * 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 <tuliom@linux.vnet.ibm.com> + [BZ #20728] * sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S: Replace a branch to _exit() by a function call. 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; } |