about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>2016-10-28 18:31:24 -0200
committerTulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>2016-10-28 19:13:21 -0200
commit739e14f9009ff91e4a8d01776e7269fc8cbd0293 (patch)
treeb8819e16088ba37dcc26c7cfa7f1ae486b7e474f
parentce193f551ec21df85c934626a21730881484dcf0 (diff)
downloadglibc-739e14f9009ff91e4a8d01776e7269fc8cbd0293.tar.gz
glibc-739e14f9009ff91e4a8d01776e7269fc8cbd0293.tar.xz
glibc-739e14f9009ff91e4a8d01776e7269fc8cbd0293.zip
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.
-rw-r--r--ChangeLog6
-rw-r--r--nptl/pthread_rwlock_unlock.c4
-rw-r--r--sysdeps/powerpc/nptl/elide.h3
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;
     }