[Glibc-bsd-commits] r6081 - trunk/glibc-ports-2.24/fbtl

aurel32 at alioth.debian.org aurel32 at alioth.debian.org
Wed Jul 6 21:18:21 UTC 2016


Author: aurel32
Date: 2016-07-06 21:18:21 +0000 (Wed, 06 Jul 2016)
New Revision: 6081

Modified:
   trunk/glibc-ports-2.24/fbtl/pthread_mutex_unlock.c
Log:
Merge from upstream:

commit 76a0b73e8102c5bfb5cb791e34992472f5d1d33e
Author: Torvald Riegel <triegel at redhat.com>
Date:   Tue Jun 14 15:12:00 2016 +0200

    Remove atomic_compare_and_exchange_bool_rel.
    


Modified: trunk/glibc-ports-2.24/fbtl/pthread_mutex_unlock.c
===================================================================
--- trunk/glibc-ports-2.24/fbtl/pthread_mutex_unlock.c	2016-07-06 21:16:54 UTC (rev 6080)
+++ trunk/glibc-ports-2.24/fbtl/pthread_mutex_unlock.c	2016-07-06 21:18:21 UTC (rev 6081)
@@ -223,15 +223,24 @@
       int private = (robust
 		     ? PTHREAD_ROBUST_MUTEX_PSHARED (mutex)
 		     : PTHREAD_MUTEX_PSHARED (mutex));
-      if ((mutex->__data.__lock & FUTEX_WAITERS) != 0
-	  || atomic_compare_and_exchange_bool_rel (&mutex->__data.__lock, 0,
-						   THREAD_GETMEM (THREAD_SELF,
-								  tid)))
+      /* Unlock the mutex using a CAS unless there are futex waiters or our
+	 TID is not the value of __lock anymore, in which case we let the
+	 kernel take care of the situation.  Use release MO in the CAS to
+	 synchronize with acquire MO in lock acquisitions.  */
+      int l = atomic_load_relaxed (&mutex->__data.__lock);
+      do
 	{
-	  INTERNAL_SYSCALL_DECL (__err);
-	  INTERNAL_SYSCALL (futex, __err, 2, &mutex->__data.__lock,
-			    __lll_private_flag (FUTEX_UNLOCK_PI, private));
+	  if (((l & FUTEX_WAITERS) != 0)
+	      || (l != THREAD_GETMEM (THREAD_SELF, tid)))
+	    {
+	      INTERNAL_SYSCALL_DECL (__err);
+	      INTERNAL_SYSCALL (futex, __err, 2, &mutex->__data.__lock,
+				__lll_private_flag (FUTEX_UNLOCK_PI, private));
+	      break;
+	    }
 	}
+      while (!atomic_compare_exchange_weak_release (&mutex->__data.__lock,
+						    &l, 0));
 
       THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL);
       break;




More information about the Glibc-bsd-commits mailing list