]> git.saurik.com Git - apple/libdispatch.git/commitdiff
libdispatch-187.10.tar.gz mac-os-x-1075 v187.10
authorApple <opensource@apple.com>
Mon, 17 Sep 2012 20:19:29 +0000 (20:19 +0000)
committerApple <opensource@apple.com>
Mon, 17 Sep 2012 20:19:29 +0000 (20:19 +0000)
src/semaphore.c

index 29585bdf51638308b7b42d97941172a6cb8166b9..81a2c410280aeaab53e9ccac2caa17ce1d6ebf45 100644 (file)
@@ -199,8 +199,7 @@ dispatch_semaphore_signal(dispatch_semaphore_t dsema)
                return 0;
        }
        if (slowpath(value == LONG_MIN)) {
                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);
 }
        }
        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_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);
        }
 }
                (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);
                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);
                }
                if (dsema->dsema_value == dsema->dsema_orig) {
                        _dispatch_group_wake(dsema);
                }