oveRTOS C API
Embedded RTOS framework — build system, configuration, and portable C API
Loading...
Searching...
No Matches
queue.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2026 Kamil Lulko <kamil.lulko@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-3.0-or-later
5 *
6 * This file is part of oveRTOS.
7 */
8
28#ifndef OVE_QUEUE_H
29#define OVE_QUEUE_H
30
31#include "ove/types.h"
32#include "ove_config.h"
33#include "ove/time.h"
34
35#ifdef __cplusplus
36extern "C" {
37#endif
38
40typedef struct ove_queue *ove_queue_t;
41
42#include "ove/storage.h"
43
44#ifdef CONFIG_OVE_QUEUE
45
67OVE_NODISCARD int ove_queue_init(ove_queue_t *q, ove_queue_storage_t *storage, void *buffer,
68 size_t item_size, unsigned int max_items) OVE_NONNULL(1, 2, 3);
69
82
83/* _create / _destroy — heap-gated */
84#ifdef OVE_HEAP_QUEUE
85
103OVE_NODISCARD int ove_queue_create(ove_queue_t *q, size_t item_size, unsigned int max_items)
104 OVE_NONNULL(1);
105
116
117#endif /* OVE_HEAP_QUEUE */
118
140OVE_NODISCARD int ove_queue_send(ove_queue_t q, const void *data, uint64_t timeout_ns)
141 OVE_NONNULL(1, 2);
142
158OVE_NODISCARD static inline int ove_queue_send_until(ove_queue_t q, const void *data,
159 uint64_t deadline_ns)
160{
161 return ove_queue_send(q, data, ove_time_deadline_to_timeout_ns(deadline_ns));
162}
163
188OVE_NODISCARD int ove_queue_receive(ove_queue_t q, void *buf, uint64_t timeout_ns)
189 OVE_NONNULL(1, 2);
190
208OVE_NODISCARD static inline int ove_queue_receive_until(ove_queue_t q, void *buf,
209 uint64_t deadline_ns)
210{
211 return ove_queue_receive(q, buf, ove_time_deadline_to_timeout_ns(deadline_ns));
212}
213
229OVE_NODISCARD int ove_queue_send_from_isr(ove_queue_t q, const void *data) OVE_NONNULL(1, 2);
230
247OVE_NODISCARD int ove_queue_receive_from_isr(ove_queue_t q, void *buf) OVE_NONNULL(1, 2);
248
270int ove_queue_set_notify(ove_queue_t q, ove_notify_cb cb, void *user_data) OVE_NONNULL(1);
271
272#else /* !CONFIG_OVE_QUEUE */
273
274/* P0-3: _init/_deinit stubs so OVE_QUEUE_DEFINE_STATIC links cleanly
275 * when CONFIG_OVE_QUEUE=n. */
276static inline int ove_queue_init(ove_queue_t *q, ove_queue_storage_t *s, void *b, size_t is,
277 unsigned int mi)
278{
279 (void)q;
280 (void)s;
281 (void)b;
282 (void)is;
283 (void)mi;
285}
286static inline void ove_queue_deinit(ove_queue_t q)
287{
288 (void)q;
289}
290
291static inline int ove_queue_create(ove_queue_t *q, size_t is, unsigned int mi)
292{
293 (void)q;
294 (void)is;
295 (void)mi;
297}
298static inline void ove_queue_destroy(ove_queue_t q)
299{
300 (void)q;
301}
302static inline int ove_queue_send(ove_queue_t q, const void *d, uint64_t t)
303{
304 (void)q;
305 (void)d;
306 (void)t;
308}
309static inline int ove_queue_receive(ove_queue_t q, void *b, uint64_t t)
310{
311 (void)q;
312 (void)b;
313 (void)t;
315}
316static inline int ove_queue_send_from_isr(ove_queue_t q, const void *d)
317{
318 (void)q;
319 (void)d;
321}
322static inline int ove_queue_receive_from_isr(ove_queue_t q, void *b)
323{
324 (void)q;
325 (void)b;
327}
328static inline int ove_queue_set_notify(ove_queue_t q, ove_notify_cb cb, void *ud)
329{
330 (void)q;
331 (void)cb;
332 (void)ud;
334}
335
336#endif /* CONFIG_OVE_QUEUE */
337
338#ifdef __cplusplus
339}
340#endif
341
342#endif /* OVE_QUEUE_H */
343
OVE_NODISCARD int ove_queue_send_from_isr(ove_queue_t q, const void *data) OVE_NONNULL(1
Send an item to the queue from an interrupt service routine.
OVE_NODISCARD int OVE_NODISCARD int ove_queue_receive_from_isr(ove_queue_t q, void *buf) OVE_NONNULL(1
Receive an item from the queue from an interrupt service routine.
OVE_NODISCARD int static OVE_NODISCARD int ove_queue_send_until(ove_queue_t q, const void *data, uint64_t deadline_ns)
Deadline-based variant of ove_queue_send.
Definition queue.h:158
void ove_queue_destroy(ove_queue_t q)
Destroy and free a queue allocated with ove_queue_create().
OVE_NODISCARD int OVE_NODISCARD int int ove_queue_set_notify(ove_queue_t q, ove_notify_cb cb, void *user_data) OVE_NONNULL(1)
Register a notify callback fired after every successful send.
OVE_NODISCARD int ove_queue_init(ove_queue_t *q, ove_queue_storage_t *storage, void *buffer, size_t item_size, unsigned int max_items) OVE_NONNULL(1
Initialise a queue using caller-supplied static storage and data buffer.
struct ove_queue * ove_queue_t
Opaque handle for a message queue object.
Definition queue.h:40
OVE_NODISCARD int ove_queue_receive(ove_queue_t q, void *buf, uint64_t timeout_ns) OVE_NONNULL(1
Receive (remove) an item from the front of the queue, blocking if it is empty.
OVE_NODISCARD int ove_queue_create(ove_queue_t *q, size_t item_size, unsigned int max_items) OVE_NONNULL(1)
Allocate and initialise a queue from the heap.
OVE_NODISCARD int ove_queue_send(ove_queue_t q, const void *data, uint64_t timeout_ns) OVE_NONNULL(1
Send an item to the back of the queue, blocking if it is full.
OVE_NODISCARD int void ove_queue_deinit(ove_queue_t q)
Release resources held by a queue initialised with ove_queue_init().
OVE_NODISCARD int static OVE_NODISCARD int ove_queue_receive_until(ove_queue_t q, void *buf, uint64_t deadline_ns)
Deadline-based variant of ove_queue_receive.
Definition queue.h:208
static uint64_t ove_time_deadline_to_timeout_ns(uint64_t deadline_ns)
Convert a steady-clock deadline to a duration suitable for the existing timeout_ns-taking APIs.
Definition time.h:162
void(* ove_notify_cb)(void *user_data)
Notify-callback signature used by the _set_notify variants of the comm primitives (stream / queue / e...
Definition types.h:298
@ OVE_ERR_NOT_SUPPORTED
Definition types.h:98