buf_ring_alloc(9)

buf_ring_alloc9

Multi-producer, {single, multi}-consumer lock-less ring buffer

Part of buf_ring(9).

Usage

#include <sys/param.h>

#include <sys/buf_ring.h>

struct buf_ring *

buf_ring_alloc(int count, struct malloc_type *type, int flags, lock);

void

buf_ring_free(struct buf_ring *br, struct malloc_type *type);

int

buf_ring_enqueue(struct buf_ring *br, void *buf);

void *

buf_ring_dequeue_mc(struct buf_ring *br);

void *

buf_ring_dequeue_sc(struct buf_ring *br);

int

buf_ring_count(struct buf_ring *br);

int

buf_ring_empty(struct buf_ring *br);

int

buf_ring_full(struct buf_ring *br);

void *

buf_ring_peek(struct buf_ring *br);

uint64_t

buf_ring_drops(struct buf_ring *br);

Overview

The buf_ring functions provide a lock-less multi-producer and lock-less multi-consumer as well as single-consumer ring buffer.

The buf_ring_alloc() function is used to allocate a buf_ring ring buffer with count slots using malloc_type type and memory flags flags. The single consumer interface is protected by lock. Supported lock types are mutex(9), rwlock(9), and rmlock(9).

The buf_ring_free() function is used to free a buf_ring. The user is responsible for freeing any enqueued items.

The buf_ring_enqueue() function is used to enqueue a buffer to a buf_ring.

The buf_ring_dequeue_mc() function is a multi-consumer safe way of dequeueing elements from a buf_ring.

The buf_ring_dequeue_sc() function is a single-consumer interface to dequeue elements - requiring the user to serialize accesses with a lock.

The buf_ring_count() function returns the number of elements in a buf_ring.

The buf_ring_empty() function returns TRUE if the buf_ring is empty, FALSE otherwise.

The buf_ring_full() function returns TRUE if no more items can be enqueued, FALSE otherwise.

The buf_ring_peek() function returns a pointer to the last element in the buf_ring if the buf_ring is not empty, NULL otherwise.

The buf_ring_drops() functions returns how many times the buf_ring_enqueue() was not able to queue an element due to no available slots.

Return values

The buf_ring_enqueue() function return ENOBUFS if there are no available slots in the buf_ring.

Releases

35 releases since FreeBSD 8.3-RELEASE; the text changed 22 times.

  1. 8.3
  2. 8.4
  3. 9.1
  4. 9.2
  5. 9.3
  6. 10.0
  7. 10.1
  8. 10.2
  9. 10.3
  10. 10.4
  11. 11.0
  12. 11.1
  13. 11.2
  14. 11.3
  15. 11.4
  16. 12.0
  17. 12.1
  18. 12.2
  19. 12.3
  20. 12.4
  21. 13.0–13.2
  22. 13.3–15.1
  23. 16.0

History

These functions were introduced in FreeBSD 8.0.

From base 16.0-CURRENT-20261027-61c70dc16a79 in FreeBSD 16.0-CURRENT (2026-10-27). Parsed by carta from the page's mdoc source.