ck_ring: Use SPSC enqueue as SPMC enqueue.

ck_pring
Samy Al Bahra 12 years ago
parent 5d1d850f44
commit 7f35cbee1b

@ -165,9 +165,9 @@ ck_ring_enqueue_spsc(struct ck_ring *ring, void *entry)
consumer = ck_pr_load_uint(&ring->c_head); consumer = ck_pr_load_uint(&ring->c_head);
producer = ring->p_tail; producer = ring->p_tail;
delta = (producer + 1) & mask; delta = producer + 1;
if (delta == (consumer & mask)) if ((delta & mask) == (consumer & mask))
return false; return false;
ring->ring[producer & mask] = entry; ring->ring[producer & mask] = entry;
@ -177,7 +177,7 @@ ck_ring_enqueue_spsc(struct ck_ring *ring, void *entry)
* that the slot is available for consumption. * that the slot is available for consumption.
*/ */
ck_pr_fence_store(); ck_pr_fence_store();
ck_pr_store_uint(&ring->p_tail, producer + 1); ck_pr_store_uint(&ring->p_tail, delta);
return true; return true;
} }
@ -217,25 +217,8 @@ ck_ring_dequeue_spsc(struct ck_ring *ring, void *data)
CK_CC_INLINE static bool CK_CC_INLINE static bool
ck_ring_enqueue_spmc(struct ck_ring *ring, void *entry) ck_ring_enqueue_spmc(struct ck_ring *ring, void *entry)
{ {
unsigned int consumer, producer, delta;
unsigned int mask = ring->mask;
consumer = ck_pr_load_uint(&ring->c_head); return ck_ring_enqueue_spsc(ring, entry);
producer = ring->p_tail;
delta = producer + 1;
if ((delta & mask) == (consumer & mask))
return false;
ring->ring[producer & mask] = entry;
/*
* Make sure to update slot value before indicating
* that the slot is available for consumption.
*/
ck_pr_fence_store();
ck_pr_store_uint(&ring->p_tail, delta);
return true;
} }
CK_CC_INLINE static bool CK_CC_INLINE static bool

Loading…
Cancel
Save