ck_ring_trydequeue_spmc(3)
dequeue from bounded FIFO and allow for spurious failure
LIBRARY
Concurrency Kit (libck, -lck)
SYNOPSIS
In ck_ring.h
Ft bool
Fn ck_ring_trydequeue_spmc ck_ring_t *ring ck_ring_buffer_t *buffer void *result
DESCRIPTION
The
Fn ck_ring_trydequeue_spmc 3
function attempts to dequeue a pointer from the bounded buffer
pointed to by
Fa ring
in FIFO fashion. The pointer is stored in the pointer
pointed to by
Fa result .
The buffer pointed to by
Fa buffer
must be unique to
Fa ring
and point to an array of ck_ring_buffer_t of sufficient
length (according to the power-of-2 elements in the buffer).
The decoupling of the ring from the buffer serves
to address use-cases involving multiple address spaces
and DMA, among others.
If you are on non-POSIX platforms or wish for strict
compliance with C, then it is recommended to pass a
pointer of type void ** for
Fa result .
This function is safe to call without locking for UINT_MAX
concurrent
Fn ck_ring_dequeue_spmc 3
or
Fn ck_ring_trydequeue_spmc 3
invocations and up to one concurrent
Fn ck_ring_enqueue_spmc 3
or
Fn ck_ring_tryenqueue_spmc 3
invocation. This operation will always complete
in a bounded number of steps. It is
possible for the function to return false even
if
Fa ring
is non-empty. This
EXAMPLE
#include <ck_ring.h>
/* This ring was previously initialized with ck_ring_init. */
ck_ring_t ring;
/* The ring was initialized for 1023 elements. */
ck_ring_buffer_t buffer[1024];
void
dequeue(void)
{
void *result;
/* Dequeue from ring until contention is actively observed. */
while (ck_ring_trydequeue_spmc(&ring, &buffer, &result) == true) {
/*
* Results contains the oldest pointer in ring
* since the dequeue operation returned true.
*/
operation(result);
}
/* An empty ring was encountered, leave. */
return;
}
RETURN VALUES
The function returns true if the dequeue operation
completely successfully in a bounded number of steps.
The result of the dequeue operation is stored in the
value pointed to by
Fa result .
Otherwise, the function will return false if the buffer was empty
or if the operation could not be completed in a bounded
number of steps. If the function returns false, then the contents
of
Fa result
are undefined.