nanokernel: Add scheduling context-independent APIs for nano_fifo

When the exact scheduling context is not known it's convenient to have
a wrapper API that uses context_type_get() to call the right function
at runtime.

Change-Id: Ie72a4b78d53f664575c1d9dfeace52b53d018850
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
This commit is contained in:
Johan Hedberg 2015-04-16 12:23:55 +03:00 committed by Anas Nashif
commit 68224c1c69
2 changed files with 42 additions and 0 deletions

View file

@ -90,6 +90,10 @@ extern void task_fiber_start(char *pStack,
/* FIFO APIs
*/
extern void nano_fifo_init(struct nano_fifo *chan);
/* scheduling context independent methods (when context is not known) */
extern void nano_fifo_put(struct nano_fifo *chan, void *data);
extern void *nano_fifo_get(struct nano_fifo *chan);
extern void *nano_fifo_get_wait(struct nano_fifo *chan);
/* methods for ISRs */
extern void nano_isr_fifo_put(struct nano_fifo *chan, void *data);
extern void *nano_isr_fifo_get(struct nano_fifo *chan);

View file

@ -192,9 +192,27 @@ void nano_task_fifo_put(
irq_unlock_inline(imask);
}
/*******************************************************************************
*
* nano_fifo_put - add an element to the end of a fifo
*
* This is a convenience wrapper for the context-specific APIs. This is
* helpful whenever the exact scheduling context is not known, but should
* be avoided when the context is known up-front (to avoid unnecessary
* overhead).
*/
void nano_fifo_put(struct nano_fifo *chan, void *data)
{
static void (*func[3])(struct nano_fifo *chan, void *data) = {
nano_isr_fifo_put, nano_fiber_fifo_put, nano_task_fifo_put
};
func[context_type_get()](chan, data);
}
FUNC_ALIAS(_fifo_get, nano_isr_fifo_get, void *);
FUNC_ALIAS(_fifo_get, nano_fiber_fifo_get, void *);
FUNC_ALIAS(_fifo_get, nano_task_fifo_get, void *);
FUNC_ALIAS(_fifo_get, nano_fifo_get, void *);
/*******************************************************************************
*
@ -360,3 +378,23 @@ void *nano_task_fifo_get_wait(
return data;
}
/*******************************************************************************
*
* nano_fifo_get_wait - get an element from the head of a fifo, poll/pend if
* not available
*
* This is a convenience wrapper for the context-specific APIs. This is
* helpful whenever the exact scheduling context is not known, but should
* be avoided when the context is known up-front (to avoid unnecessary
* overhead).
*
* It's only valid to call this API from a fiber or a task.
*/
void *nano_fifo_get_wait(struct nano_fifo *chan)
{
static void *(*func[3])(struct nano_fifo *chan) = {
NULL, nano_fiber_fifo_get_wait, nano_task_fifo_get_wait
};
return func[context_type_get()](chan);
}