|
|
@ -34,7 +34,7 @@ Concurrency Kit (libck, \-lck)
|
|
|
|
.Sh SYNOPSIS
|
|
|
|
.Sh SYNOPSIS
|
|
|
|
.In ck_ring.h
|
|
|
|
.In ck_ring.h
|
|
|
|
.Ft bool
|
|
|
|
.Ft bool
|
|
|
|
.Fn ck_ring_enqueue_spmc_size "ck_ring_t *ring" "void *entry" "unsigned int *length"
|
|
|
|
.Fn ck_ring_enqueue_spmc_size "ck_ring_t *ring" "ck_ring_buffer_t *buffer" "void *entry" "unsigned int *length"
|
|
|
|
.Sh DESCRIPTION
|
|
|
|
.Sh DESCRIPTION
|
|
|
|
The
|
|
|
|
The
|
|
|
|
.Fn ck_ring_enqueue_spmc 3
|
|
|
|
.Fn ck_ring_enqueue_spmc 3
|
|
|
@ -43,6 +43,15 @@ function enqueues the pointer
|
|
|
|
into the bounded buffer pointed to by
|
|
|
|
into the bounded buffer pointed to by
|
|
|
|
.Fa ring
|
|
|
|
.Fa ring
|
|
|
|
in FIFO fashion.
|
|
|
|
in FIFO fashion.
|
|
|
|
|
|
|
|
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
|
|
|
|
If you are on non-POSIX platforms or wish for strict
|
|
|
|
compliance with C, then it is recommended to pass a
|
|
|
|
compliance with C, then it is recommended to pass a
|
|
|
|
pointer of type void ** for
|
|
|
|
pointer of type void ** for
|
|
|
@ -61,6 +70,9 @@ guarantees for one active invocation.
|
|
|
|
/* This ring was previously initialized with ck_ring_init. */
|
|
|
|
/* This ring was previously initialized with ck_ring_init. */
|
|
|
|
ck_ring_t ring;
|
|
|
|
ck_ring_t ring;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* The ring was initialized for 1023 elements. */
|
|
|
|
|
|
|
|
ck_ring_buffer_t buffer[1024];
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|
enqueue(void)
|
|
|
|
enqueue(void)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -68,7 +80,7 @@ enqueue(void)
|
|
|
|
unsigned int length;
|
|
|
|
unsigned int length;
|
|
|
|
|
|
|
|
|
|
|
|
/* Attempt to enqueue pointer to some_object into buffer. */
|
|
|
|
/* Attempt to enqueue pointer to some_object into buffer. */
|
|
|
|
if (ck_ring_enqueue_spmc_size(&ring, &entry, &length) == false) {
|
|
|
|
if (ck_ring_enqueue_spmc_size(&ring, &buffer, &entry, &length) == false) {
|
|
|
|
/*
|
|
|
|
/*
|
|
|
|
* The buffer was full and the enqueue operation
|
|
|
|
* The buffer was full and the enqueue operation
|
|
|
|
* has failed.
|
|
|
|
* has failed.
|
|
|
|