diff options
Diffstat (limited to 'cpukit/score/src/threadq.c')
-rw-r--r-- | cpukit/score/src/threadq.c | 41 |
1 files changed, 21 insertions, 20 deletions
diff --git a/cpukit/score/src/threadq.c b/cpukit/score/src/threadq.c index bdd380d188..3b1b47bf3a 100644 --- a/cpukit/score/src/threadq.c +++ b/cpukit/score/src/threadq.c @@ -19,9 +19,7 @@ #endif #include <rtems/score/threadqimpl.h> -#include <rtems/score/chainimpl.h> #include <rtems/score/rbtreeimpl.h> -#include <rtems/score/scheduler.h> #include <rtems/score/threadimpl.h> RBTree_Compare_result _Thread_queue_Compare_priority( @@ -29,35 +27,38 @@ RBTree_Compare_result _Thread_queue_Compare_priority( const RBTree_Node *right ) { - Priority_Control left_priority = - THREAD_RBTREE_NODE_TO_THREAD( left )->current_priority; - Priority_Control right_priority = - THREAD_RBTREE_NODE_TO_THREAD( right )->current_priority; + const Thread_Control *left_thread; + const Thread_Control *right_thread; + Priority_Control left_prio; + Priority_Control right_prio; + + left_thread = THREAD_RBTREE_NODE_TO_THREAD( left ); + right_thread = THREAD_RBTREE_NODE_TO_THREAD( right ); + left_prio = left_thread->current_priority; + right_prio = right_thread->current_priority; /* * SuperCore priorities use lower numbers to indicate greater importance. */ - if ( left_priority == right_priority ) - return 0; - if ( left_priority < right_priority ) - return -1; - return 1; + return ( left_prio > right_prio ) - ( left_prio < right_prio ); } void _Thread_queue_Initialize( - Thread_queue_Control *the_thread_queue, - Thread_queue_Disciplines the_discipline, - uint32_t timeout_status + Thread_queue_Control *the_thread_queue, + Thread_queue_Disciplines the_discipline ) { - the_thread_queue->discipline = the_discipline; - the_thread_queue->timeout_status = timeout_status; - the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED; + const Thread_queue_Operations *operations; + + _ISR_lock_Initialize( &the_thread_queue->Lock, "Thread Queue" ); if ( the_discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) { - _RBTree_Initialize_empty( &the_thread_queue->Queues.Priority ); - } else { /* must be THREAD_QUEUE_DISCIPLINE_FIFO */ - _Chain_Initialize_empty( &the_thread_queue->Queues.Fifo ); + operations = &_Thread_queue_Operations_priority; + } else { + _Assert( the_discipline == THREAD_QUEUE_DISCIPLINE_FIFO ); + operations = &_Thread_queue_Operations_FIFO; } + the_thread_queue->operations = operations; + ( *operations->initialize )( the_thread_queue ); } |