+ /* Perform a recursive unlock suitable for self-sync'd destruction */
+ do {
+ v = b->_b_lock;
+ w = b->_b_waiters;
+ } while (a_cas(&b->_b_lock, v, v==INT_MIN+1 ? 0 : v-1) != v);
+
+ /* Wake a thread waiting to reuse or destroy the barrier */
+ if (v==INT_MIN+1 || (v==1 && w))
+ __wake(&b->_b_lock, 1, 0);
+