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);
}
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);
}
}
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);
}