From 647b95df9fa324795f3398d0562d363fd7d5079f Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 10 Jun 2014 16:32:12 +0200 Subject: score: Use chain nodes for ready queue support This reduces the API to the minimum data structures to maximize the re-usability. --- .../include/rtems/score/schedulerpriorityimpl.h | 49 +++++++++++----------- .../include/rtems/score/schedulerprioritysmpimpl.h | 12 +++--- cpukit/score/src/schedulerprioritychangepriority.c | 6 +-- cpukit/score/src/schedulerprioritysmp.c | 2 +- cpukit/score/src/schedulerpriorityunblock.c | 2 +- 5 files changed, 36 insertions(+), 35 deletions(-) diff --git a/cpukit/score/include/rtems/score/schedulerpriorityimpl.h b/cpukit/score/include/rtems/score/schedulerpriorityimpl.h index 3980d10c8c..063d4362fe 100644 --- a/cpukit/score/include/rtems/score/schedulerpriorityimpl.h +++ b/cpukit/score/include/rtems/score/schedulerpriorityimpl.h @@ -65,56 +65,56 @@ RTEMS_INLINE_ROUTINE void _Scheduler_priority_Ready_queue_initialize( } /** - * @brief Enqueues a thread on the specified ready queue. + * @brief Enqueues a node on the specified ready queue. * - * The thread is placed as the last element of its priority group. + * The node is placed as the last element of its priority group. * - * @param[in] the_thread The thread to enqueue. + * @param[in] node The node to enqueue. * @param[in] ready_queue The ready queue. * @param[in] bit_map The priority bit map of the scheduler instance. */ RTEMS_INLINE_ROUTINE void _Scheduler_priority_Ready_queue_enqueue( - Thread_Control *the_thread, + Chain_Node *node, Scheduler_priority_Ready_queue *ready_queue, Priority_bit_map_Control *bit_map ) { Chain_Control *ready_chain = ready_queue->ready_chain; - _Chain_Append_unprotected( ready_chain, &the_thread->Object.Node ); + _Chain_Append_unprotected( ready_chain, node ); _Priority_bit_map_Add( bit_map, &ready_queue->Priority_map ); } /** - * @brief Enqueues a thread on the specified ready queue as first. + * @brief Enqueues a node on the specified ready queue as first. * - * The thread is placed as the first element of its priority group. + * The node is placed as the first element of its priority group. * - * @param[in] the_thread The thread to enqueue as first. + * @param[in] node The node to enqueue as first. * @param[in] ready_queue The ready queue. * @param[in] bit_map The priority bit map of the scheduler instance. */ RTEMS_INLINE_ROUTINE void _Scheduler_priority_Ready_queue_enqueue_first( - Thread_Control *the_thread, + Chain_Node *node, Scheduler_priority_Ready_queue *ready_queue, Priority_bit_map_Control *bit_map ) { Chain_Control *ready_chain = ready_queue->ready_chain; - _Chain_Prepend_unprotected( ready_chain, &the_thread->Object.Node ); + _Chain_Prepend_unprotected( ready_chain, node ); _Priority_bit_map_Add( bit_map, &ready_queue->Priority_map ); } /** - * @brief Extracts a thread from the specified ready queue. + * @brief Extracts a node from the specified ready queue. * - * @param[in] the_thread The thread to extract. + * @param[in] node The node to extract. * @param[in] ready_queue The ready queue. * @param[in] bit_map The priority bit map of the scheduler instance. */ RTEMS_INLINE_ROUTINE void _Scheduler_priority_Ready_queue_extract( - Thread_Control *the_thread, + Chain_Node *node, Scheduler_priority_Ready_queue *ready_queue, Priority_bit_map_Control *bit_map ) @@ -125,7 +125,7 @@ RTEMS_INLINE_ROUTINE void _Scheduler_priority_Ready_queue_extract( _Chain_Initialize_empty( ready_chain ); _Priority_bit_map_Remove( bit_map, &ready_queue->Priority_map ); } else { - _Chain_Extract_unprotected( &the_thread->Object.Node ); + _Chain_Extract_unprotected( node ); } } @@ -139,30 +139,30 @@ RTEMS_INLINE_ROUTINE void _Scheduler_priority_Extract_body( Scheduler_priority_Node *node = _Scheduler_priority_Node_get( the_thread ); _Scheduler_priority_Ready_queue_extract( - the_thread, + &the_thread->Object.Node, &node->Ready_queue, &context->Bit_map ); } /** - * @brief Return a pointer to the first thread. + * @brief Return a pointer to the first node. * - * This routines returns a pointer to the first thread on @a ready_queues. + * This routines returns a pointer to the first node on @a ready_queues. * * @param[in] bit_map The priority bit map of the scheduler instance. * @param[in] ready_queues The ready queues of the scheduler instance. * - * @return This method returns the first thread or NULL + * @return This method returns the first node. */ -RTEMS_INLINE_ROUTINE Thread_Control *_Scheduler_priority_Ready_queue_first( +RTEMS_INLINE_ROUTINE Chain_Node *_Scheduler_priority_Ready_queue_first( Priority_bit_map_Control *bit_map, Chain_Control *ready_queues ) { Priority_Control index = _Priority_bit_map_Get_highest( bit_map ); - return (Thread_Control *) _Chain_First( &ready_queues[ index ] ); + return _Chain_First( &ready_queues[ index ] ); } /** @@ -179,10 +179,11 @@ RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body( { Scheduler_priority_Context *context = _Scheduler_priority_Get_context( scheduler ); - Thread_Control *heir = _Scheduler_priority_Ready_queue_first( - &context->Bit_map, - &context->Ready[ 0 ] - ); + Thread_Control *heir = (Thread_Control *) + _Scheduler_priority_Ready_queue_first( + &context->Bit_map, + &context->Ready[ 0 ] + ); ( void ) the_thread; diff --git a/cpukit/score/include/rtems/score/schedulerprioritysmpimpl.h b/cpukit/score/include/rtems/score/schedulerprioritysmpimpl.h index a8196218c1..d3e2106f4b 100644 --- a/cpukit/score/include/rtems/score/schedulerprioritysmpimpl.h +++ b/cpukit/score/include/rtems/score/schedulerprioritysmpimpl.h @@ -69,7 +69,7 @@ static inline void _Scheduler_priority_SMP_Move_from_scheduled_to_ready( _Chain_Extract_unprotected( &scheduled_to_ready->Object.Node ); _Scheduler_priority_Ready_queue_enqueue_first( - scheduled_to_ready, + &scheduled_to_ready->Object.Node, &node->Ready_queue, &self->Bit_map ); @@ -86,13 +86,13 @@ static inline void _Scheduler_priority_SMP_Move_from_ready_to_scheduled( _Scheduler_priority_SMP_Node_get( ready_to_scheduled ); _Scheduler_priority_Ready_queue_extract( - ready_to_scheduled, + &ready_to_scheduled->Object.Node, &node->Ready_queue, &self->Bit_map ); _Scheduler_simple_Insert_priority_fifo( &self->Base.Scheduled, - ready_to_scheduled + &ready_to_scheduled->Object.Node ); } @@ -107,7 +107,7 @@ static inline void _Scheduler_priority_SMP_Insert_ready_lifo( _Scheduler_priority_SMP_Node_get( thread ); _Scheduler_priority_Ready_queue_enqueue( - thread, + &thread->Object.Node, &node->Ready_queue, &self->Bit_map ); @@ -124,7 +124,7 @@ static inline void _Scheduler_priority_SMP_Insert_ready_fifo( _Scheduler_priority_SMP_Node_get( thread ); _Scheduler_priority_Ready_queue_enqueue_first( - thread, + &thread->Object.Node, &node->Ready_queue, &self->Bit_map ); @@ -141,7 +141,7 @@ static inline void _Scheduler_priority_SMP_Extract_from_ready( _Scheduler_priority_SMP_Node_get( thread ); _Scheduler_priority_Ready_queue_extract( - thread, + &thread->Object.Node, &node->Ready_queue, &self->Bit_map ); diff --git a/cpukit/score/src/schedulerprioritychangepriority.c b/cpukit/score/src/schedulerprioritychangepriority.c index 448c603861..91b9fa71a2 100644 --- a/cpukit/score/src/schedulerprioritychangepriority.c +++ b/cpukit/score/src/schedulerprioritychangepriority.c @@ -33,7 +33,7 @@ void _Scheduler_priority_Change_priority( Scheduler_priority_Node *node = _Scheduler_priority_Node_get( the_thread ); _Scheduler_priority_Ready_queue_extract( - the_thread, + &the_thread->Object.Node, &node->Ready_queue, &context->Bit_map ); @@ -47,13 +47,13 @@ void _Scheduler_priority_Change_priority( if ( prepend_it ) { _Scheduler_priority_Ready_queue_enqueue_first( - the_thread, + &the_thread->Object.Node, &node->Ready_queue, &context->Bit_map ); } else { _Scheduler_priority_Ready_queue_enqueue( - the_thread, + &the_thread->Object.Node, &node->Ready_queue, &context->Bit_map ); diff --git a/cpukit/score/src/schedulerprioritysmp.c b/cpukit/score/src/schedulerprioritysmp.c index bcbd26df3f..b6b5ff415e 100644 --- a/cpukit/score/src/schedulerprioritysmp.c +++ b/cpukit/score/src/schedulerprioritysmp.c @@ -75,7 +75,7 @@ static Thread_Control *_Scheduler_priority_SMP_Get_highest_ready( (void) thread; - return _Scheduler_priority_Ready_queue_first( + return (Thread_Control *) _Scheduler_priority_Ready_queue_first( &self->Bit_map, &self->Ready[ 0 ] ); diff --git a/cpukit/score/src/schedulerpriorityunblock.c b/cpukit/score/src/schedulerpriorityunblock.c index e83bff1abf..ef46df87e2 100644 --- a/cpukit/score/src/schedulerpriorityunblock.c +++ b/cpukit/score/src/schedulerpriorityunblock.c @@ -32,7 +32,7 @@ void _Scheduler_priority_Unblock ( Scheduler_priority_Node *node = _Scheduler_priority_Node_get( the_thread ); _Scheduler_priority_Ready_queue_enqueue( - the_thread, + &the_thread->Object.Node, &node->Ready_queue, &context->Bit_map ); -- cgit v1.2.3