![]() |
The FreeRADIUS server $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
|
Thread-safe queues. More...
#include <freeradius-devel/util/stdatomic.h>#include <freeradius-devel/util/talloc.h>
Include dependency graph for atomic_queue.h:Go to the source code of this file.
Typedefs | |
| typedef struct fr_atomic_queue_s | fr_atomic_queue_t |
| typedef struct fr_atomic_ring_s | fr_atomic_ring_t |
| Unbounded segmented single-producer / single-consumer queue. | |
Functions | |
| void | fr_atomic_queue_debug (FILE *fp, fr_atomic_queue_t *aq) |
| Dump an atomic queue. | |
| void | fr_atomic_queue_free (fr_atomic_queue_t **aq) |
| Free an atomic queue if it's not freed by ctx. | |
| fr_atomic_queue_t * | fr_atomic_queue_malloc (size_t size) |
| Create fixed-size atomic queue outside any talloc hierarchy. | |
| bool | fr_atomic_queue_pop (fr_atomic_queue_t *aq, void **p_data) |
| Pop a pointer from the atomic queue. | |
| bool | fr_atomic_queue_push (fr_atomic_queue_t *aq, void *data) |
| Push a pointer into the atomic queue. | |
| size_t | fr_atomic_queue_size (fr_atomic_queue_t *aq) |
| fr_atomic_queue_t * | fr_atomic_queue_talloc (TALLOC_CTX *ctx, size_t size) |
| Create fixed-size atomic queue. | |
| fr_atomic_ring_t * | fr_atomic_ring_alloc (TALLOC_CTX *ctx, size_t seg_size) |
| Allocate an empty SPSC ring. | |
| void | fr_atomic_ring_free (fr_atomic_ring_t **ring) |
| Free the ring and all remaining segments. | |
| bool | fr_atomic_ring_pop (fr_atomic_ring_t *ring, void **p_data) |
| Pop a pointer from the ring, advancing past drained segments. | |
| bool | fr_atomic_ring_push (fr_atomic_ring_t *ring, void *data) |
| Push a pointer into the ring; allocate a new segment on overflow. | |
Thread-safe queues.
Definition in file atomic_queue.h.
| typedef struct fr_atomic_queue_s fr_atomic_queue_t |
Definition at line 40 of file atomic_queue.h.
| typedef struct fr_atomic_ring_s fr_atomic_ring_t |
Unbounded segmented single-producer / single-consumer queue.
Internally a linked list of fixed-size fr_atomic_queue_t segments. When the producer's current segment fills, a new segment is malloc'd and linked in; the consumer drains segments in order and frees them as it advances. Allocation on the producer side uses raw malloc (not talloc), so the producer thread is free to be one that cannot safely use talloc (e.g. a library-owned callback thread).
Exactly one producer and one consumer. Not safe for MPMC use.
Definition at line 60 of file atomic_queue.h.
| void fr_atomic_queue_debug | ( | FILE * | fp, |
| fr_atomic_queue_t * | aq | ||
| ) |
Dump an atomic queue.
Absolutely NOT thread-safe.
| [in] | aq | The atomic queue to debug. |
| [in] | fp | where the debugging information will be printed. |
Definition at line 661 of file atomic_queue.c.
Here is the caller graph for this function:| void fr_atomic_queue_free | ( | fr_atomic_queue_t ** | aq | ) |
Free an atomic queue if it's not freed by ctx.
This function is needed because the atomic queue memory must be cache line aligned, and may live either in a talloc chunk or a raw posix_memalign allocation (aq->chunk == NULL).
Definition at line 212 of file atomic_queue.c.
Here is the call graph for this function:
Here is the caller graph for this function:| fr_atomic_queue_t * fr_atomic_queue_malloc | ( | size_t | size | ) |
Create fixed-size atomic queue outside any talloc hierarchy.
Backed by posix_memalign; the resulting queue is released with fr_atomic_queue_free (which detects the raw allocation via a NULL chunk field) or plain free() on the queue pointer.
Intended for callers that push or pop from threads where talloc is not safe (for example, library-owned callback threads).
| [in] | size | The number of entries in the queue. |
Definition at line 188 of file atomic_queue.c.
Here is the call graph for this function:
Here is the caller graph for this function:| bool fr_atomic_queue_pop | ( | fr_atomic_queue_t * | aq, |
| void ** | p_data | ||
| ) |
Pop a pointer from the atomic queue.
| [in] | aq | the atomic queue to retrieve data from. |
| [out] | p_data | where to write the data. |
Definition at line 355 of file atomic_queue.c.
Here is the caller graph for this function:| bool fr_atomic_queue_push | ( | fr_atomic_queue_t * | aq, |
| void * | data | ||
| ) |
Push a pointer into the atomic queue.
| [in] | aq | The atomic queue to add data to. |
| [in] | data | to push. |
Definition at line 232 of file atomic_queue.c.
Here is the call graph for this function:
Here is the caller graph for this function:| size_t fr_atomic_queue_size | ( | fr_atomic_queue_t * | aq | ) |
| fr_atomic_queue_t * fr_atomic_queue_talloc | ( | TALLOC_CTX * | ctx, |
| size_t | size | ||
| ) |
Create fixed-size atomic queue.
| [in] | ctx | The talloc ctx to allocate the queue in. |
| [in] | size | The number of entries in the queue. |
Definition at line 143 of file atomic_queue.c.
Here is the call graph for this function:
Here is the caller graph for this function:| fr_atomic_ring_t * fr_atomic_ring_alloc | ( | TALLOC_CTX * | ctx, |
| size_t | seg_size | ||
| ) |
Allocate an empty SPSC ring.
| [in] | ctx | talloc ctx that owns the ring handle (segments live outside talloc; they are freed by the ring's destructor). |
| [in] | seg_size | Per-segment capacity. Rounded up to a power of 2. |
Definition at line 504 of file atomic_queue.c.
Here is the call graph for this function:
Here is the caller graph for this function:| void fr_atomic_ring_free | ( | fr_atomic_ring_t ** | ring_p | ) |
Free the ring and all remaining segments.
Equivalent to talloc_free() on the ring, but nulls the caller's handle in the style of fr_atomic_queue_free.
Definition at line 533 of file atomic_queue.c.
Here is the call graph for this function:
Here is the caller graph for this function:| bool fr_atomic_ring_pop | ( | fr_atomic_ring_t * | ring, |
| void ** | p_data | ||
| ) |
Pop a pointer from the ring, advancing past drained segments.
Single-consumer only. Must not be called concurrently with itself.
| [in] | ring | Ring to pop from. |
| [out] | p_data | Where to write the popped value on success. |
Definition at line 595 of file atomic_queue.c.
Here is the call graph for this function:
Here is the caller graph for this function:| bool fr_atomic_ring_push | ( | fr_atomic_ring_t * | ring, |
| void * | data | ||
| ) |
Push a pointer into the ring; allocate a new segment on overflow.
Single-producer only. Must not be called concurrently with itself.
| [in] | ring | Ring to push into. |
| [in] | data | Value to push (must be non-NULL). |
Definition at line 552 of file atomic_queue.c.
Here is the call graph for this function:
Here is the caller graph for this function:
1.9.8