From: Apple Date: Mon, 17 Sep 2012 20:19:29 +0000 (+0000) Subject: libdispatch-187.10.tar.gz X-Git-Tag: mac-os-x-1075^0 X-Git-Url: https://git.saurik.com/apple/libdispatch.git/commitdiff_plain/66adbf37b24d7fc6671f00f587979f1b51531d48?ds=sidebyside libdispatch-187.10.tar.gz --- diff --git a/src/semaphore.c b/src/semaphore.c index 29585bd..81a2c41 100644 --- a/src/semaphore.c +++ b/src/semaphore.c @@ -199,8 +199,7 @@ dispatch_semaphore_signal(dispatch_semaphore_t dsema) 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); } @@ -385,9 +384,12 @@ void 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); } } @@ -542,7 +544,7 @@ dispatch_group_notify_f(dispatch_group_t dg, dispatch_queue_t dq, void *ctxt, 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); }