ATOMIC(3) | Library Functions Manual | ATOMIC(3) |
OSAtomicEnqueue
,
OSAtomicDequeue
— atomic
lockless queues
#include
<libkern/OSAtomic.h>
void
OSAtomicEnqueue
(OSQueueHead
*list, void *new,
size_t offset);
void*
OSAtomicDequeue
(OSQueueHead
*list, size_t
offset);
The routines
OSAtomicEnqueue
()
and OSAtomicDequeue
() operate on singly linked LIFO
queues. Ie, a dequeue operation will return the most recently enqueued
element, or NULL if the list is empty. The operations are lockless, and
barriers are used as necessary to permit thread-safe access to the queue
element. offset is the offset in bytes to the link
field in the queue element.
OSAtomicDequeue
()
returns until all concurrent calls to
OSAtomicDequeue
() for the same list on other threads
have also returned, as they may still be accessing that memory location.typedef struct elem { long data1; struct elem *link; int data2; } elem_t; elem_t fred, mary, *p; OSQueueHead q = OS_ATOMIC_QUEUE_INIT; OSAtomicEnqueue( &q, &fred, offsetof(elem_t,link) ); OSAtomicEnqueue( &q, &mary, offsetof(elem_t,link) ); p = OSAtomicDequeue( &q, offsetof(elem_t,link) );
In this example, the call of
OSAtomicDequeue
() will return a ptr to mary.
The dequeue operation returns the most recently enqueued element, or NULL if the list in empty.
These functions first appeared in Mac OS 10.5 (Leopard).
May 26, 2004 | Darwin |