[libdispatch-changes] [213] trunk/src/semaphore.c

source_changes at macosforge.org source_changes at macosforge.org
Wed Aug 8 22:08:50 PDT 2012


Revision: 213
          http://trac.macosforge.org/projects/libdispatch/changeset/213
Author:   dsteffen at apple.com
Date:     2012-08-08 22:08:50 -0700 (Wed, 08 Aug 2012)
Log Message:
-----------
<rdar://problem/11754320>

Modified Paths:
--------------
    trunk/src/semaphore.c

Modified: trunk/src/semaphore.c
===================================================================
--- trunk/src/semaphore.c	2012-08-09 05:08:47 UTC (rev 212)
+++ trunk/src/semaphore.c	2012-08-09 05:08:50 UTC (rev 213)
@@ -188,8 +188,7 @@
 		return 0;
 	}
 	if (slowpath(value == LONG_MIN)) {
-		DISPATCH_CLIENT_CRASH("Unbalanced call to dispatch_group_leave() or "
-				"dispatch_semaphore_signal()");
+		DISPATCH_CLIENT_CRASH("Unbalanced call to dispatch_semaphore_signal()");
 	}
 	return _dispatch_semaphore_signal_slow(dsema);
 }
@@ -377,9 +376,12 @@
 dispatch_group_leave(dispatch_group_t dg)
 {
 	dispatch_semaphore_t dsema = (dispatch_semaphore_t)dg;
-
-	dispatch_semaphore_signal(dsema);
-	if (dsema->dsema_value == dsema->dsema_orig) {
+	dispatch_atomic_release_barrier();
+	long value = dispatch_atomic_inc2o(dsema, dsema_value);
+	if (slowpath(value == LONG_MIN)) {
+		DISPATCH_CLIENT_CRASH("Unbalanced call to dispatch_group_leave()");
+	}
+	if (slowpath(value == dsema->dsema_orig)) {
 		(void)_dispatch_group_wake(dsema);
 	}
 }
@@ -534,7 +536,7 @@
 		prev->dsn_next = dsn;
 	} else {
 		_dispatch_retain(dg);
-		dsema->dsema_notify_head = dsn;
+		(void)dispatch_atomic_xchg2o(dsema, dsema_notify_head, dsn);
 		if (dsema->dsema_value == dsema->dsema_orig) {
 			_dispatch_group_wake(dsema);
 		}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/libdispatch-changes/attachments/20120808/c3e281ca/attachment.html>


More information about the libdispatch-changes mailing list