From 66adbf37b24d7fc6671f00f587979f1b51531d48 Mon Sep 17 00:00:00 2001 From: Apple Date: Mon, 17 Sep 2012 20:19:29 +0000 Subject: [PATCH] libdispatch-187.10.tar.gz --- src/semaphore.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) 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); } -- 2.45.2