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/threadresume.c | 95 +++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 c/src/exec/score/src/threadresume.c (limited to 'c/src/exec/score/src/threadresume.c') diff --git a/c/src/exec/score/src/threadresume.c b/c/src/exec/score/src/threadresume.c new file mode 100644 index 0000000000..067dc59610 --- /dev/null +++ b/c/src/exec/score/src/threadresume.c @@ -0,0 +1,95 @@ +/* + * 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_Resume + * + * This kernel routine clears the SUSPEND state if the suspend_count + * drops below one. If the force parameter is set the suspend_count + * is forced back to zero. The thread ready chain is adjusted if + * necessary and the Heir thread is set accordingly. + * + * Input parameters: + * the_thread - pointer to thread control block + * force - force the suspend count back to 0 + * + * Output parameters: NONE + * + * INTERRUPT LATENCY: + * priority map + * select heir + */ + + +void _Thread_Resume( + Thread_Control *the_thread, + boolean force +) +{ + + ISR_Level level; + States_Control current_state; + + _ISR_Disable( level ); + + if ( force == TRUE ) + the_thread->suspend_count = 0; + else + the_thread->suspend_count--; + + if ( the_thread->suspend_count > 0 ) { + _ISR_Enable( level ); + return; + } + + current_state = the_thread->current_state; + if ( current_state & STATES_SUSPENDED ) { + current_state = + the_thread->current_state = _States_Clear(STATES_SUSPENDED, current_state); + + if ( _States_Is_ready( current_state ) ) { + + _Priority_Add_to_bit_map( &the_thread->Priority_map ); + + _Chain_Append_unprotected(the_thread->ready, &the_thread->Object.Node); + + _ISR_Flash( level ); + + if ( the_thread->current_priority < _Thread_Heir->current_priority ) { + _Thread_Heir = the_thread; + if ( _Thread_Executing->is_preemptible || + the_thread->current_priority == 0 ) + _Context_Switch_necessary = TRUE; + } + } + } + + _ISR_Enable( level ); +} -- cgit v1.2.3