From eb02f47b126b56091ffaeaad470a48e2ac6d57b5 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Wed, 10 Nov 1999 13:48:27 +0000 Subject: Committed modifications from ITRON Task and Task Dependendent Synchronization Working Group. Included are tests. --- c/src/exec/score/src/threadrotatequeue.c | 93 ++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 c/src/exec/score/src/threadrotatequeue.c (limited to 'c/src/exec/score/src/threadrotatequeue.c') diff --git a/c/src/exec/score/src/threadrotatequeue.c b/c/src/exec/score/src/threadrotatequeue.c new file mode 100644 index 0000000000..f7ee9c12f5 --- /dev/null +++ b/c/src/exec/score/src/threadrotatequeue.c @@ -0,0 +1,93 @@ +/* + * Thread Handler + * + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/*PAGE + * + * _Thread_Rotate_Ready_Queue + * + * This kernel routine will rotate the ready queue. + * remove the running THREAD from the ready chain + * and place it immediatly at the rear of this chain. Reset timeslice + * and yield the processor functions both use this routine, therefore if + * reset is TRUE and this is the only thread on the chain then the + * timeslice counter is reset. The heir THREAD will be updated if the + * running is also the currently the heir. + * + * Input parameters: + * Priority of the queue we wish to modify. + * + * Output parameters: NONE + * + * INTERRUPT LATENCY: + * ready chain + * select heir + */ + +void _Thread_Rotate_Ready_Queue( + Priority_Control priority +) +{ + ISR_Level level; + Thread_Control *executing; + Chain_Control *ready; + Chain_Node *node; + + ready = &_Thread_Ready_chain[ priority ]; + executing = _Thread_Executing; + + if ( ready == executing->ready ) { + _Thread_Yield_processor(); + return; + } + + _ISR_Disable( level ); + + if ( !_Chain_Is_empty( ready ) ) { + if (!_Chain_Has_only_one_node( ready ) ) { + node = _Chain_Get_first_unprotected( ready ); + _Chain_Append_unprotected( ready, node ); + } + } + + _ISR_Flash( level ); + + if ( _Thread_Heir->ready == ready ) + _Thread_Heir = (Thread_Control *) ready->first; + + if ( executing != _Thread_Heir ) + _Context_Switch_necessary = TRUE; + + _ISR_Enable( level ); +} + + + + + + -- cgit v1.2.3