|  | #pragma once | 
|  | #include "FreeRTOS.h" | 
|  | #include <queue.h> | 
|  |  | 
|  | #define errQUEUE_EMPTY pdFALSE | 
|  | #define errQUEUE_FULL pdFALSE | 
|  |  | 
|  | /** | 
|  | * Queue handle.  This is used to reference queues in the API functions. | 
|  | */ | 
|  | typedef struct MessageQueue *QueueHandle_t; | 
|  |  | 
|  | /** | 
|  | * Receive a message on a queue.  The message is received into `buffer`, which | 
|  | * must be large enough to accommodate a message of the size passed to | 
|  | * `xQueueCreate`.  This blocks for up to `waitTicks` ticks if the queue is | 
|  | * empty. | 
|  | * | 
|  | * Returns `pdPASS` if a message was received, or `errQUEUE_EMPTY` if the queue | 
|  | * is empty and no message arrived (or was not collected by another | 
|  | * higher-priority thread) for the duration of the call. | 
|  | */ | 
|  | static inline BaseType_t | 
|  | xQueueReceive(QueueHandle_t queueHandle, void *buffer, TickType_t waitTicks) | 
|  | { | 
|  | struct Timeout timeout = {0, waitTicks}; | 
|  | int            rv = queue_receive(&timeout, queueHandle, buffer); | 
|  |  | 
|  | if (rv == 0) | 
|  | return pdPASS; | 
|  | return errQUEUE_EMPTY; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Send a message to the queue.  Blocks for up to `waitTicks` ticks if the | 
|  | * queue is full.  The message is copied from `buffer` which must be large | 
|  | * enough to accommodate a message of the size passed to `xQueueCreate`. | 
|  | * | 
|  | * returns `pdPASS` if the message was sent, or `errQUEUE_FULL` if the queue | 
|  | * remained full for the duration of the call. | 
|  | */ | 
|  | static inline BaseType_t xQueueSendToBack(QueueHandle_t queueHandle, | 
|  | const void   *buffer, | 
|  | TickType_t    waitTicks) | 
|  | { | 
|  | struct Timeout timeout = {0, waitTicks}; | 
|  | int            rv      = queue_send(&timeout, queueHandle, buffer); | 
|  |  | 
|  | if (rv == 0) | 
|  | return pdPASS; | 
|  | return errQUEUE_FULL; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Send a message to the queue from an ISR.  We do not allow running code from | 
|  | * ISRs and so this behaves like a non-blocking `xQueueSendToBack`. | 
|  | * | 
|  | * The `pxHigherPriorityTaskWoken` parameter is used to return whether a yield | 
|  | * is necessary.  A yield is never necessary in this implementation and so this | 
|  | * is unconditionally given a value of `pdFALSE`. | 
|  | */ | 
|  | static inline BaseType_t | 
|  | xQueueSendToBackFromISR(QueueHandle_t queueHandle, | 
|  | const void   *buffer, | 
|  | BaseType_t   *pxHigherPriorityTaskWoken) | 
|  | { | 
|  | *pxHigherPriorityTaskWoken = pdFALSE; | 
|  | return xQueueSendToBack(queueHandle, buffer, 0); | 
|  | } | 
|  |  | 
|  | #ifndef CHERIOT_NO_AMBIENT_MALLOC | 
|  | /** | 
|  | * Create a queue that can store `uxQueueLength` messages of size `uxItemSize`. | 
|  | * Returns NULL if queue creation failed, false otherwise. | 
|  | */ | 
|  | static inline QueueHandle_t xQueueCreate(UBaseType_t uxQueueLength, | 
|  | UBaseType_t uxItemSize) | 
|  | { | 
|  | QueueHandle_t  ret = NULL; | 
|  | struct Timeout timeout = {0, UnlimitedTimeout}; | 
|  | int rc = queue_create(&timeout, | 
|  | MALLOC_CAPABILITY, | 
|  | &ret, | 
|  | uxItemSize, | 
|  | uxQueueLength); | 
|  | return ret; | 
|  | } | 
|  | #endif | 
|  |  | 
|  | /** | 
|  | * Delete a queue.  This frees the memory associated with the queue. | 
|  | */ | 
|  | static inline void vQueueDelete(QueueHandle_t xQueue) | 
|  | { | 
|  | queue_destroy(MALLOC_CAPABILITY, xQueue); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Return the number of messages waiting in a queue. | 
|  | * | 
|  | * Note: This is inherently racy and should not be used for anything other than | 
|  | * debugging. | 
|  | */ | 
|  | static inline UBaseType_t uxQueueMessagesWaiting(const QueueHandle_t xQueue) | 
|  | { | 
|  | size_t ret; | 
|  | int    rv = queue_items_remaining(xQueue, &ret); | 
|  |  | 
|  | assert(rv == 0); | 
|  |  | 
|  | return ret; | 
|  | } |