From 227f9b7e3e3ad570adccec22df0e2da29080b4e9 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Wed, 17 Sep 2014 10:37:54 +0000 Subject: [PATCH] Added new chThdDoDequeueNextI() API. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7286 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/rt/include/chthreads.h | 25 +++++++++++++++++++++++++ os/rt/src/chthreads.c | 22 ++++------------------ 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/os/rt/include/chthreads.h b/os/rt/include/chthreads.h index ca2d3bcbc..fa093b09c 100644 --- a/os/rt/include/chthreads.h +++ b/os/rt/include/chthreads.h @@ -393,6 +393,31 @@ static inline bool chThdQueueIsEmptyI(threads_queue_t *tqp) { return queue_isempty(tqp); } + +/** + * @brief Dequeues and wakes up one thread from the threads queue object. + * @details Dequeues one thread from the queue without checking if the queue + * is empty. + * @pre The queue must contain at least an object. + * + * @param[in] tqp pointer to the threads queue object + * @param[in] msg the message code + * + * @iclass + */ +static inline void chThdDoDequeueNextI(threads_queue_t *tqp, msg_t msg) { + thread_t *tp; + + chDbgAssert(queue_notempty(tqp), "empty queue"); + + tp = queue_fifo_remove(tqp); + + chDbgAssert(tp->p_state == CH_STATE_QUEUED, "invalid state"); + + tp->p_u.rdymsg = msg; + chSchReadyI(tp); +} + #endif /* _CHTHREADS_H_ */ /** @} */ diff --git a/os/rt/src/chthreads.c b/os/rt/src/chthreads.c index d7e9bc13d..3cff4dc61 100644 --- a/os/rt/src/chthreads.c +++ b/os/rt/src/chthreads.c @@ -640,15 +640,8 @@ msg_t chThdEnqueueTimeoutS(threads_queue_t *tqp, systime_t timeout) { */ void chThdDequeueNextI(threads_queue_t *tqp, msg_t msg) { - if (queue_notempty(tqp)) { - thread_t *tp = queue_fifo_remove(tqp); - - chDbgAssert(tp->p_state == CH_STATE_QUEUED, - "not CH_STATE_QUEUED"); - - tp->p_u.rdymsg = msg; - chSchReadyI(tp); - } + if (queue_notempty(tqp)) + chThdDoDequeueNextI(tqp, msg); } /** @@ -661,15 +654,8 @@ void chThdDequeueNextI(threads_queue_t *tqp, msg_t msg) { */ void chThdDequeueAllI(threads_queue_t *tqp, msg_t msg) { - while (queue_notempty(tqp)) { - thread_t *tp = queue_fifo_remove(tqp); - - chDbgAssert(tp->p_state == CH_STATE_QUEUED, - "not CH_STATE_QUEUED"); - - tp->p_u.rdymsg = msg; - chSchReadyI(tp); - } + while (queue_notempty(tqp)) + chThdDoDequeueNextI(tqp, msg); } /** @} */