7#ifndef _PICO_UTIL_QUEUE_H
8#define _PICO_UTIL_QUEUE_H
14#ifndef PICO_QUEUE_MAX_LEVEL
15#define PICO_QUEUE_MAX_LEVEL 0
46#if PICO_QUEUE_MAX_LEVEL
93 int32_t rc = (int32_t)q->
wptr - (int32_t)q->
rptr;
113#if PICO_QUEUE_MAX_LEVEL
121static inline uint queue_get_max_level(
queue_t *q) {
126#if PICO_QUEUE_MAX_LEVEL
132static inline void queue_reset_max_level(
queue_t *q) {
static __force_inline uint32_t spin_lock_blocking(spin_lock_t *lock)
Acquire a spin lock safely.
Definition spin_lock.h:354
static __force_inline void spin_unlock(spin_lock_t *lock, uint32_t saved_irq)
Release a spin lock safely.
Definition spin_lock.h:385
uint next_striped_spin_lock_num(void)
Return a spin lock number from the striped range.
Definition sync.c:18
void queue_peek_blocking(queue_t *q, void *data)
Blocking peek at next value to be removed from queue.
Definition queue.c:125
static uint queue_get_level_unsafe(queue_t *q)
Unsafe check of level of the specified queue.
Definition queue.h:92
bool queue_try_remove(queue_t *q, void *data)
Non-blocking removal of entry from the queue if non empty.
Definition queue.c:109
bool queue_try_add(queue_t *q, const void *data)
Non-blocking add value queue if not full.
Definition queue.c:105
static uint queue_get_level(queue_t *q)
Check of level of the specified queue.
Definition queue.h:106
static bool queue_is_empty(queue_t *q)
Check if queue is empty.
Definition queue.h:147
void queue_remove_blocking(queue_t *q, void *data)
Blocking remove entry from queue.
Definition queue.c:121
void queue_free(queue_t *q)
Destroy the specified queue.
Definition queue.c:21
bool queue_try_peek(queue_t *q, void *data)
Non-blocking peek at the next item to be removed from the queue.
Definition queue.c:113
void queue_add_blocking(queue_t *q, const void *data)
Blocking add of value to queue.
Definition queue.c:117
bool queue_init_with_spinlock(queue_t *q, uint element_size, uint element_count, uint spinlock_num)
Initialise a queue with a specific spinlock for concurrency protection.
Definition queue.c:11
static bool queue_init(queue_t *q, uint element_size, uint element_count)
Initialise a queue, allocating a (possibly shared) spinlock.
Definition queue.h:70
static bool queue_is_full(queue_t *q)
Check if queue is full.
Definition queue.h:159
spin_lock_t * spin_lock
Spin lock protecting this lock's state.
Definition lock_core.h:70
A multi-core and IRQ safe queue instance.
Definition queue.h:39
lock_core_t core
Core lock state used for synchronisation.
Definition queue.h:40
uint16_t element_count
Maximum number of elements the queue can hold.
Definition queue.h:45
uint8_t * data
Pointer to the backing data buffer.
Definition queue.h:41
uint16_t rptr
Read pointer (index of next slot to read).
Definition queue.h:43
uint16_t element_size
Size in bytes of each element.
Definition queue.h:44
uint16_t wptr
Write pointer (index of next slot to write).
Definition queue.h:42