|
| 1 | +/* |
| 2 | + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD |
| 3 | + * |
| 4 | + * SPDX-License-Identifier: Apache-2.0 |
| 5 | + */ |
| 6 | + |
| 7 | +#ifndef _FIXED_PKT_QUEUE_H_ |
| 8 | +#define _FIXED_PKT_QUEUE_H_ |
| 9 | + |
| 10 | + |
| 11 | +#include "osi/pkt_queue.h" |
| 12 | +#include "osi/semaphore.h" |
| 13 | + |
| 14 | +#ifdef __cplusplus |
| 15 | +extern "C" { |
| 16 | +#endif |
| 17 | + |
| 18 | +#ifndef FIXED_PKT_QUEUE_SIZE_MAX |
| 19 | +#define FIXED_PKT_QUEUE_SIZE_MAX 254 |
| 20 | +#endif |
| 21 | + |
| 22 | +#define FIXED_PKT_QUEUE_MAX_TIMEOUT OSI_SEM_MAX_TIMEOUT |
| 23 | + |
| 24 | +struct fixed_pkt_queue_t; |
| 25 | + |
| 26 | +typedef struct fixed_pkt_queue_t fixed_pkt_queue_t; |
| 27 | + |
| 28 | +typedef void (*fixed_pkt_queue_free_cb)(pkt_linked_item_t *data); |
| 29 | +typedef void (*fixed_pkt_queue_cb)(fixed_pkt_queue_t *queue); |
| 30 | + |
| 31 | +// Creates a new fixed queue with the given |capacity|. If more elements than |
| 32 | +// |capacity| are added to the queue, the caller is blocked until space is |
| 33 | +// made available in the queue. Returns NULL on failure. The caller must free |
| 34 | +// the returned queue with |fixed_pkt_queue_free|. |
| 35 | +fixed_pkt_queue_t *fixed_pkt_queue_new(size_t capacity); |
| 36 | + |
| 37 | +// Freeing a queue that is currently in use (i.e. has waiters |
| 38 | +// blocked on it) results in undefined behaviour. |
| 39 | +void fixed_pkt_queue_free(fixed_pkt_queue_t *queue, fixed_pkt_queue_free_cb free_cb); |
| 40 | + |
| 41 | +// Returns a value indicating whether the given |queue| is empty. If |queue| |
| 42 | +// is NULL, the return value is true. |
| 43 | +bool fixed_pkt_queue_is_empty(fixed_pkt_queue_t *queue); |
| 44 | + |
| 45 | +// Returns the length of the |queue|. If |queue| is NULL, the return value |
| 46 | +// is 0. |
| 47 | +size_t fixed_pkt_queue_length(fixed_pkt_queue_t *queue); |
| 48 | + |
| 49 | +// Returns the maximum number of elements this queue may hold. |queue| may |
| 50 | +// not be NULL. |
| 51 | +size_t fixed_pkt_queue_capacity(fixed_pkt_queue_t *queue); |
| 52 | + |
| 53 | +// Enqueues the given |data| into the |queue|. The caller will be blocked or immediately return or wait for timeout according to the parameter timeout. |
| 54 | +// If enqueue failed, it will return false, otherwise return true |
| 55 | +bool fixed_pkt_queue_enqueue(fixed_pkt_queue_t *queue, pkt_linked_item_t *linked_pkt, uint32_t timeout); |
| 56 | + |
| 57 | +// Dequeues the next element from |queue|. If the queue is currently empty, |
| 58 | +// this function will block the caller until an item is enqueued or immediately return or wait for timeout according to the parameter timeout. |
| 59 | +// If dequeue failed, it will return NULL, otherwise return a point. |
| 60 | +pkt_linked_item_t *fixed_pkt_queue_dequeue(fixed_pkt_queue_t *queue, uint32_t timeout); |
| 61 | + |
| 62 | +// Returns the first element from |queue|, if present, without dequeuing it. |
| 63 | +// This function will never block the caller. Returns NULL if there are no |
| 64 | +// elements in the queue or |queue| is NULL. |
| 65 | +pkt_linked_item_t *fixed_pkt_queue_try_peek_first(fixed_pkt_queue_t *queue); |
| 66 | + |
| 67 | +// Registers |queue| with |reactor| for dequeue operations. When there is an element |
| 68 | +// in the queue, ready_cb will be called. The |context| parameter is passed, untouched, |
| 69 | +// to the callback routine. Neither |queue|, nor |reactor|, nor |read_cb| may be NULL. |
| 70 | +// |context| may be NULL. |
| 71 | +void fixed_pkt_queue_register_dequeue(fixed_pkt_queue_t *queue, fixed_pkt_queue_cb ready_cb); |
| 72 | + |
| 73 | +// Unregisters the dequeue ready callback for |queue| from whichever reactor |
| 74 | +// it is registered with, if any. This function is idempotent. |
| 75 | +void fixed_pkt_queue_unregister_dequeue(fixed_pkt_queue_t *queue); |
| 76 | + |
| 77 | +void fixed_pkt_queue_process(fixed_pkt_queue_t *queue); |
| 78 | + |
| 79 | +#endif |
0 commit comments