diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-08-11 10:26:57 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-08-11 11:13:42 +0200 |
commit | 424ffe4db039878eae13428d1ddeeb4a7c7f47fe (patch) | |
tree | 8f6e984f0f0c386e3c7aa58b9fb817aba6e56ea2 /cpukit/score/src/threadqops.c | |
parent | score: Dismantle _Thread_queue_Do_extract_locked() (diff) | |
download | rtems-424ffe4db039878eae13428d1ddeeb4a7c7f47fe.tar.bz2 |
score: Introduce thread queue surrender operation
This is an optimization for _Thread_queue_Surrender(). It helps to
encapsulate the priority boosting in the priority inheritance thread
queue operations.
Diffstat (limited to 'cpukit/score/src/threadqops.c')
-rw-r--r-- | cpukit/score/src/threadqops.c | 79 |
1 files changed, 71 insertions, 8 deletions
diff --git a/cpukit/score/src/threadqops.c b/cpukit/score/src/threadqops.c index df7054f0c8..41506bfceb 100644 --- a/cpukit/score/src/threadqops.c +++ b/cpukit/score/src/threadqops.c @@ -71,12 +71,11 @@ static Thread_queue_Heads *_Thread_queue_Queue_enqueue( static void _Thread_queue_Queue_extract( Thread_queue_Queue *queue, + Thread_queue_Heads *heads, Thread_Control *the_thread, void ( *extract )( Thread_queue_Heads *, Thread_Control * ) ) { - Thread_queue_Heads *heads = queue->heads; - _Assert( heads != NULL ); the_thread->Wait.spare_heads = RTEMS_CONTAINER_OF( @@ -142,6 +141,7 @@ static void _Thread_queue_FIFO_extract( { _Thread_queue_Queue_extract( queue, + queue->heads, the_thread, _Thread_queue_FIFO_do_extract ); @@ -160,6 +160,25 @@ static Thread_Control *_Thread_queue_FIFO_first( return THREAD_CHAIN_NODE_TO_THREAD( first ); } +static Thread_Control *_Thread_queue_FIFO_surrender( + Thread_queue_Queue *queue, + Thread_queue_Heads *heads, + Thread_Control *previous_owner +) +{ + Thread_Control *first; + + first = _Thread_queue_FIFO_first( heads ); + _Thread_queue_Queue_extract( + queue, + heads, + first, + _Thread_queue_FIFO_do_extract + ); + + return first; +} + static Thread_queue_Priority_queue *_Thread_queue_Priority_queue( Thread_queue_Heads *heads, const Thread_Control *the_thread @@ -296,6 +315,7 @@ static void _Thread_queue_Priority_extract( { _Thread_queue_Queue_extract( queue, + queue->heads, the_thread, _Thread_queue_Priority_do_extract ); @@ -322,6 +342,25 @@ static Thread_Control *_Thread_queue_Priority_first( return THREAD_RBTREE_NODE_TO_THREAD( first ); } +static Thread_Control *_Thread_queue_Priority_surrender( + Thread_queue_Queue *queue, + Thread_queue_Heads *heads, + Thread_Control *previous_owner +) +{ + Thread_Control *first; + + first = _Thread_queue_Priority_first( heads ); + _Thread_queue_Queue_extract( + queue, + heads, + first, + _Thread_queue_Priority_do_extract + ); + + return first; +} + static void _Thread_queue_Priority_inherit_enqueue( Thread_queue_Queue *queue, Thread_Control *the_thread, @@ -374,14 +413,12 @@ static void _Thread_queue_Priority_inherit_enqueue( } } -#if defined(RTEMS_SMP) -void _Thread_queue_Boost_priority( - Thread_queue_Queue *queue, +static void _Thread_queue_Boost_priority( + Thread_queue_Heads *heads, Thread_Control *the_thread ) { - Thread_queue_Heads *heads = queue->heads; - +#if defined(RTEMS_SMP) if ( !_Chain_Has_only_one_node( &heads->Heads.Fifo ) ) { const Scheduler_Control *scheduler; Priority_Control boost_priority; @@ -394,8 +431,31 @@ void _Thread_queue_Boost_priority( _Scheduler_Thread_set_priority( the_thread, boost_priority, false ); } -} +#else + (void) heads; + (void) the_thread; #endif +} + +static Thread_Control *_Thread_queue_Priority_inherit_surrender( + Thread_queue_Queue *queue, + Thread_queue_Heads *heads, + Thread_Control *previous_owner +) +{ + Thread_Control *first; + + first = _Thread_queue_Priority_first( heads ); + _Thread_queue_Boost_priority( heads, first ); + _Thread_queue_Queue_extract( + queue, + heads, + first, + _Thread_queue_Priority_do_extract + ); + + return first; +} const Thread_queue_Operations _Thread_queue_Operations_default = { .priority_change = _Thread_queue_Do_nothing_priority_change, @@ -411,6 +471,7 @@ const Thread_queue_Operations _Thread_queue_Operations_FIFO = { .priority_change = _Thread_queue_Do_nothing_priority_change, .enqueue = _Thread_queue_FIFO_enqueue, .extract = _Thread_queue_FIFO_extract, + .surrender = _Thread_queue_FIFO_surrender, .first = _Thread_queue_FIFO_first }; @@ -418,6 +479,7 @@ const Thread_queue_Operations _Thread_queue_Operations_priority = { .priority_change = _Thread_queue_Priority_priority_change, .enqueue = _Thread_queue_Priority_enqueue, .extract = _Thread_queue_Priority_extract, + .surrender = _Thread_queue_Priority_surrender, .first = _Thread_queue_Priority_first }; @@ -425,5 +487,6 @@ const Thread_queue_Operations _Thread_queue_Operations_priority_inherit = { .priority_change = _Thread_queue_Priority_priority_change, .enqueue = _Thread_queue_Priority_inherit_enqueue, .extract = _Thread_queue_Priority_extract, + .surrender = _Thread_queue_Priority_inherit_surrender, .first = _Thread_queue_Priority_first }; |