kernel: queue, fifo: Add cancel_wait operation.
Currently, a queue/fifo getter chooses how long to wait for an element. But there are scenarios when putter would know better, there should be a way to expire getter's timeout to make it run again. k_queue_cancel_wait() and k_fifo_cancel_wait() functions do just that. They cause corresponding *_get() functions to return with NULL value, as if timeout expired on getter's side (even K_FOREVER). This can be used to signal out of band conditions from putter to getter, e.g. end of processing, error, configuration change, etc. A specific event would be communicated to getter by other means (e.g. using existing shared context structures). Without this call, achieving the same effect would require e.g. calling k_fifo_put() with a pointer to a special sentinal memory structure - such structure would need to be allocated somewhere and somehow, and getter would need to recognize it from a normal data item. Having cancel_wait() functions offers an elegant alternative. From this perspective, these calls can be seen as an equivalent to e.g. k_fifo_put(fifo, NULL), except that such call won't work in practice. Change-Id: I47b7f690dc325a80943082bcf5345c41649e7024 Signed-off-by: Paul Sokolovsky <paul.sokolovsky@linaro.org>
This commit is contained in:
parent
bca1077d3c
commit
3f50707672
5 changed files with 115 additions and 1 deletions
|
@ -1274,6 +1274,20 @@ struct k_queue {
|
|||
*/
|
||||
extern void k_queue_init(struct k_queue *queue);
|
||||
|
||||
/**
|
||||
* @brief Cancel waiting on a queue.
|
||||
*
|
||||
* This routine causes first thread pending on @a queue, if any, to
|
||||
* return from k_queue_get() call with NULL value (as if timeout expired).
|
||||
*
|
||||
* @note Can be called by ISRs.
|
||||
*
|
||||
* @param queue Address of the queue.
|
||||
*
|
||||
* @return N/A
|
||||
*/
|
||||
extern void k_queue_cancel_wait(struct k_queue *queue);
|
||||
|
||||
/**
|
||||
* @brief Append an element to the end of a queue.
|
||||
*
|
||||
|
@ -1445,6 +1459,22 @@ struct k_fifo {
|
|||
#define k_fifo_init(fifo) \
|
||||
k_queue_init((struct k_queue *) fifo)
|
||||
|
||||
/**
|
||||
* @brief Cancel waiting on a fifo.
|
||||
*
|
||||
* This routine causes first thread pending on @a fifo, if any, to
|
||||
* return from k_fifo_get() call with NULL value (as if timeout
|
||||
* expired).
|
||||
*
|
||||
* @note Can be called by ISRs.
|
||||
*
|
||||
* @param fifo Address of the fifo.
|
||||
*
|
||||
* @return N/A
|
||||
*/
|
||||
#define k_fifo_cancel_wait(fifo) \
|
||||
k_queue_cancel_wait((struct k_queue *) fifo)
|
||||
|
||||
/**
|
||||
* @brief Add an element to a fifo.
|
||||
*
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue