diff options
Diffstat (limited to 'c/src/exec/score/src/threadrotatequeue.c')
-rw-r--r-- | c/src/exec/score/src/threadrotatequeue.c | 93 |
1 files changed, 93 insertions, 0 deletions
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 <rtems/system.h> +#include <rtems/score/apiext.h> +#include <rtems/score/context.h> +#include <rtems/score/interr.h> +#include <rtems/score/isr.h> +#include <rtems/score/object.h> +#include <rtems/score/priority.h> +#include <rtems/score/states.h> +#include <rtems/score/sysstate.h> +#include <rtems/score/thread.h> +#include <rtems/score/threadq.h> +#include <rtems/score/userext.h> +#include <rtems/score/wkspace.h> + +/*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 ); +} + + + + + + |