From: Heng Li Date: Wed, 9 Oct 2013 00:54:22 +0000 (-0400) Subject: use test-and-set for spin lock X-Git-Tag: spawn-final~14 X-Git-Url: http://www.kaiwu.me/postgresql/commit/static/gitweb.js?a=commitdiff_plain;h=1b4415cd9c7aebc16432b3f13a0b6aaa323d033b;p=klib.git use test-and-set for spin lock --- diff --git a/kthread.c b/kthread.c index d927ced..981215f 100644 --- a/kthread.c +++ b/kthread.c @@ -38,26 +38,26 @@ void dq_destroy(deque_t *d) int dq_enq(deque_t *q, int is_back, const dqval_t *v) { int ret = 0; - while (!__sync_bool_compare_and_swap(&q->lock, 0, 1)); + while (__sync_lock_test_and_set(&q->lock, 1)); if (!dq_is_full(q)) { q->a[(is_back? q->first + q->count : q->first + q->mask) & q->mask] = *v; q->first = is_back? q->first : q->first? q->first - 1 : q->mask; ++q->count; } else ret = -1; - while (!__sync_bool_compare_and_swap(&q->lock, 1, 0)); + __sync_lock_release(&q->lock); return ret; } int dq_deq(deque_t *q, int is_back, dqval_t *v) { int ret = 0; - while (!__sync_bool_compare_and_swap(&q->lock, 0, 1)); + while (__sync_lock_test_and_set(&q->lock, 1)); if (dq_size(q)) { *v = q->a[is_back? (q->first + q->count + q->mask) & q->mask : q->first]; q->first = is_back? q->first : q->first == q->mask? 0 : q->first + 1; --q->count; } else ret = -1; - while (!__sync_bool_compare_and_swap(&q->lock, 1, 0)); + __sync_lock_release(&q->lock); return 0; }