diff options
-rw-r--r-- | cpukit/score/Makefile.am | 4 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/threadimpl.h | 18 | ||||
-rw-r--r-- | cpukit/score/src/threadqdequeue.c | 81 | ||||
-rw-r--r-- | cpukit/score/src/threadqenqueue.c | 118 | ||||
-rw-r--r-- | cpukit/score/src/threadqextract.c | 71 |
5 files changed, 118 insertions, 174 deletions
diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am index 031c9a8b2d..265a49689b 100644 --- a/cpukit/score/Makefile.am +++ b/cpukit/score/Makefile.am @@ -297,8 +297,8 @@ libscore_a_SOURCES += src/threaddispatchdisablelevel.c endif ## THREADQ_C_FILES -libscore_a_SOURCES += src/threadq.c src/threadqdequeue.c \ - src/threadqenqueue.c src/threadqextract.c src/threadqrequeue.c \ +libscore_a_SOURCES += src/threadq.c \ + src/threadqenqueue.c src/threadqrequeue.c \ src/threadqextractwithproxy.c src/threadqfirst.c \ src/threadqflush.c src/threadqprocesstimeout.c src/threadqtimeout.c diff --git a/cpukit/score/include/rtems/score/threadimpl.h b/cpukit/score/include/rtems/score/threadimpl.h index d7c2ea2052..b968a055c9 100644 --- a/cpukit/score/include/rtems/score/threadimpl.h +++ b/cpukit/score/include/rtems/score/threadimpl.h @@ -417,24 +417,6 @@ Thread_Control *_Thread_Acquire( */ Thread_Control *_Thread_Acquire_executing( ISR_lock_Context *lock_context ); -/** - * @brief Finalize a blocking operation. - * - * This method is used to finalize a blocking operation that was - * satisfied. It may be used with thread queues or any other synchronization - * object that uses the blocking states and watchdog times for timeout. - * - * This method will restore the previous ISR disable level during the cancel - * operation. Thus it is an implicit _ISR_Enable(). - * - * @param[in] the_thread is the thread whose blocking is canceled - * @param[in] level is the previous ISR disable level - */ -void _Thread_blocking_operation_Finalize( - Thread_Control *the_thread, - ISR_Level level -); - RTEMS_INLINE_ROUTINE Per_CPU_Control *_Thread_Get_CPU( const Thread_Control *thread ) diff --git a/cpukit/score/src/threadqdequeue.c b/cpukit/score/src/threadqdequeue.c deleted file mode 100644 index 52ba009021..0000000000 --- a/cpukit/score/src/threadqdequeue.c +++ /dev/null @@ -1,81 +0,0 @@ -/** - * @file - * - * @brief Thread Queue Dequeue - * - * @ingroup ScoreThreadQ - */ - -/* - * COPYRIGHT (c) 1989-2014. - * On-Line Applications Research Corporation (OAR). - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#if HAVE_CONFIG_H -#include "config.h" -#endif - -#include <rtems/score/chainimpl.h> -#include <rtems/score/threadimpl.h> -#include <rtems/score/threadqimpl.h> -#include <rtems/score/isrlevel.h> -#include <rtems/score/rbtreeimpl.h> -#include <rtems/score/watchdogimpl.h> - -Thread_Control *_Thread_queue_Dequeue( - Thread_queue_Control *the_thread_queue -) -{ - Thread_Control *the_thread; - ISR_Level level; - Thread_blocking_operation_States sync_state; - - the_thread = NULL; - _ISR_Disable( level ); - - /* - * Invoke the discipline specific dequeue method. - */ - if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_FIFO ) { - if ( !_Chain_Is_empty( &the_thread_queue->Queues.Fifo ) ) { - the_thread = (Thread_Control *) - _Chain_Get_first_unprotected( &the_thread_queue->Queues.Fifo ); - } - } else { /* must be THREAD_QUEUE_DISCIPLINE_PRIORITY */ - RBTree_Node *first; - - first = _RBTree_Get( &the_thread_queue->Queues.Priority, RBT_LEFT ); - if ( first ) { - the_thread = THREAD_RBTREE_NODE_TO_THREAD( first ); - } - } - - if ( the_thread == NULL ) { - /* - * We did not find a thread to unblock in the queue. Maybe the executing - * thread is about to block on this thread queue. - */ - sync_state = the_thread_queue->sync_state; - if ( (sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) || - (sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED) ) { - the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SATISFIED; - the_thread = _Thread_Executing; - } else { - _ISR_Enable( level ); - return NULL; - } - } - - /* - * We found a thread to unblock. - * - * NOTE: This is invoked with interrupts still disabled. - */ - _Thread_blocking_operation_Finalize( the_thread, level ); - - return the_thread; -} diff --git a/cpukit/score/src/threadqenqueue.c b/cpukit/score/src/threadqenqueue.c index da2f554528..fbc0ba0ff5 100644 --- a/cpukit/score/src/threadqenqueue.c +++ b/cpukit/score/src/threadqenqueue.c @@ -1,7 +1,7 @@ /** * @file * - * @brief Thread Queue Enqueue + * @brief Thread Queue Operations * @ingroup ScoreThreadQ */ @@ -20,10 +20,24 @@ #include <rtems/score/threadqimpl.h> #include <rtems/score/isrlevel.h> +#include <rtems/score/rbtreeimpl.h> #include <rtems/score/threadimpl.h> #include <rtems/score/watchdogimpl.h> -void _Thread_blocking_operation_Finalize( +/** + * @brief Finalize a blocking operation. + * + * This method is used to finalize a blocking operation that was + * satisfied. It may be used with thread queues or any other synchronization + * object that uses the blocking states and watchdog times for timeout. + * + * This method will restore the previous ISR disable level during the cancel + * operation. Thus it is an implicit _ISR_Enable(). + * + * @param[in] the_thread is the thread whose blocking is canceled + * @param[in] level is the previous ISR disable level + */ +static void _Thread_blocking_operation_Finalize( Thread_Control *the_thread, ISR_Level level ) @@ -182,3 +196,103 @@ void _Thread_queue_Enqueue_with_handler( _Thread_blocking_operation_Cancel( sync_state, the_thread, level ); } } + +void _Thread_queue_Extract_with_return_code( + Thread_queue_Control *the_thread_queue, + Thread_Control *the_thread, + uint32_t return_code +) +{ + ISR_Level level; + + _ISR_Disable( level ); + + if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) { + _ISR_Enable( level ); + return; + } + + if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_FIFO ) { + _Chain_Extract_unprotected( &the_thread->Object.Node ); + } else { /* must be THREAD_QUEUE_DISCIPLINE_PRIORITY */ + _RBTree_Extract( + &the_thread->Wait.queue->Queues.Priority, + &the_thread->RBNode + ); + } + + the_thread->Wait.return_code = return_code; + + /* + * We found a thread to unblock. + * + * NOTE: This is invoked with interrupts still disabled. + */ + _Thread_blocking_operation_Finalize( the_thread, level ); +} + +void _Thread_queue_Extract( + Thread_queue_Control *the_thread_queue, + Thread_Control *the_thread +) +{ + _Thread_queue_Extract_with_return_code( + the_thread_queue, + the_thread, + the_thread->Wait.return_code + ); +} + +Thread_Control *_Thread_queue_Dequeue( + Thread_queue_Control *the_thread_queue +) +{ + Thread_Control *the_thread; + ISR_Level level; + Thread_blocking_operation_States sync_state; + + the_thread = NULL; + _ISR_Disable( level ); + + /* + * Invoke the discipline specific dequeue method. + */ + if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_FIFO ) { + if ( !_Chain_Is_empty( &the_thread_queue->Queues.Fifo ) ) { + the_thread = (Thread_Control *) + _Chain_Get_first_unprotected( &the_thread_queue->Queues.Fifo ); + } + } else { /* must be THREAD_QUEUE_DISCIPLINE_PRIORITY */ + RBTree_Node *first; + + first = _RBTree_Get( &the_thread_queue->Queues.Priority, RBT_LEFT ); + if ( first ) { + the_thread = THREAD_RBTREE_NODE_TO_THREAD( first ); + } + } + + if ( the_thread == NULL ) { + /* + * We did not find a thread to unblock in the queue. Maybe the executing + * thread is about to block on this thread queue. + */ + sync_state = the_thread_queue->sync_state; + if ( (sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) || + (sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED) ) { + the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SATISFIED; + the_thread = _Thread_Executing; + } else { + _ISR_Enable( level ); + return NULL; + } + } + + /* + * We found a thread to unblock. + * + * NOTE: This is invoked with interrupts still disabled. + */ + _Thread_blocking_operation_Finalize( the_thread, level ); + + return the_thread; +} diff --git a/cpukit/score/src/threadqextract.c b/cpukit/score/src/threadqextract.c deleted file mode 100644 index d12d3c889a..0000000000 --- a/cpukit/score/src/threadqextract.c +++ /dev/null @@ -1,71 +0,0 @@ -/** - * @file - * - * @brief Extracts Thread from Thread Queue - * - * @ingroup ScoreThreadQ - */ - -/* - * COPYRIGHT (c) 1989-2014. - * On-Line Applications Research Corporation (OAR). - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#if HAVE_CONFIG_H -#include "config.h" -#endif - -#include <rtems/score/chainimpl.h> -#include <rtems/score/threadimpl.h> -#include <rtems/score/threadqimpl.h> -#include <rtems/score/watchdogimpl.h> - -void _Thread_queue_Extract_with_return_code( - Thread_queue_Control *the_thread_queue, - Thread_Control *the_thread, - uint32_t return_code -) -{ - ISR_Level level; - - _ISR_Disable( level ); - - if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) { - _ISR_Enable( level ); - return; - } - - if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_FIFO ) { - _Chain_Extract_unprotected( &the_thread->Object.Node ); - } else { /* must be THREAD_QUEUE_DISCIPLINE_PRIORITY */ - _RBTree_Extract( - &the_thread->Wait.queue->Queues.Priority, - &the_thread->RBNode - ); - } - - the_thread->Wait.return_code = return_code; - - /* - * We found a thread to unblock. - * - * NOTE: This is invoked with interrupts still disabled. - */ - _Thread_blocking_operation_Finalize( the_thread, level ); -} - -void _Thread_queue_Extract( - Thread_queue_Control *the_thread_queue, - Thread_Control *the_thread -) -{ - _Thread_queue_Extract_with_return_code( - the_thread_queue, - the_thread, - the_thread->Wait.return_code - ); -} |