From 342708b9834096a2c8a9ad604626c82da6fb956c Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 26 Mar 2015 21:45:20 +0100 Subject: score: Return prev state in thread state set/clear --- cpukit/score/include/rtems/score/threadimpl.h | 20 +++++++++++--------- cpukit/score/src/threadclearstate.c | 22 +++++++++++++++------- cpukit/score/src/threadsetstate.c | 4 +++- 3 files changed, 29 insertions(+), 17 deletions(-) (limited to 'cpukit') diff --git a/cpukit/score/include/rtems/score/threadimpl.h b/cpukit/score/include/rtems/score/threadimpl.h index f32362f7e2..65625b6011 100644 --- a/cpukit/score/include/rtems/score/threadimpl.h +++ b/cpukit/score/include/rtems/score/threadimpl.h @@ -242,17 +242,17 @@ void _Thread_Ready( ); /** - * @brief Clears the indicated STATES for @a the_thread. + * @brief Clears the specified thread state. * - * This routine clears the indicated STATES for @a the_thread. It performs - * any necessary scheduling operations including the selection of - * a new heir thread. + * In case the previous state is a non-ready state and the next state is the + * ready state, then the thread is unblocked by the scheduler. * - * - INTERRUPT LATENCY: - * + priority map - * + select heir + * @param[in] the_thread The thread. + * @param[in] state The state to clear. It must not be zero. + * + * @return The previous state. */ -void _Thread_Clear_state( +States_Control _Thread_Clear_state( Thread_Control *the_thread, States_Control state ); @@ -265,8 +265,10 @@ void _Thread_Clear_state( * * @param[in] the_thread The thread. * @param[in] state The state to set. It must not be zero. + * + * @return The previous state. */ -void _Thread_Set_state( +States_Control _Thread_Set_state( Thread_Control *the_thread, States_Control state ); diff --git a/cpukit/score/src/threadclearstate.c b/cpukit/score/src/threadclearstate.c index c60fb8fc41..ae54e3aac1 100644 --- a/cpukit/score/src/threadclearstate.c +++ b/cpukit/score/src/threadclearstate.c @@ -19,27 +19,35 @@ #endif #include +#include #include -void _Thread_Clear_state( +States_Control _Thread_Clear_state( Thread_Control *the_thread, States_Control state ) { ISR_lock_Context lock_context; - States_Control current_state; + States_Control previous_state; + + _Assert( state != 0 ); _Scheduler_Acquire( the_thread, &lock_context ); - current_state = the_thread->current_state; - if ( current_state & state ) { - current_state = - the_thread->current_state = _States_Clear( state, current_state ); + previous_state = the_thread->current_state; + + if ( ( previous_state & state ) != 0 ) { + States_Control next_state; - if ( _States_Is_ready( current_state ) ) { + next_state = _States_Clear( state, previous_state ); + the_thread->current_state = next_state; + + if ( _States_Is_ready( next_state ) ) { _Scheduler_Unblock( the_thread ); } } _Scheduler_Release( the_thread, &lock_context ); + + return previous_state; } diff --git a/cpukit/score/src/threadsetstate.c b/cpukit/score/src/threadsetstate.c index 2769711dac..51128279b1 100644 --- a/cpukit/score/src/threadsetstate.c +++ b/cpukit/score/src/threadsetstate.c @@ -25,7 +25,7 @@ #include #include -void _Thread_Set_state( +States_Control _Thread_Set_state( Thread_Control *the_thread, States_Control state ) @@ -47,4 +47,6 @@ void _Thread_Set_state( } _Scheduler_Release( the_thread, &lock_context ); + + return previous_state; } -- cgit v1.2.3