From 50aef135a405a0dc26c39d7cfe7066f85b3dfbb5 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 11 Nov 2021 08:35:22 +0100 Subject: score: Add _Thread_MP_Extract_proxy() Remove _Thread_queue_Extract_with_proxy() and move the proxy extraction to _Thread_MP_Extract_proxy(). Move similar code blocks of the previous caller of _Thread_queue_Extract_with_proxy() to helper functions. Update #4546. --- cpukit/include/rtems/score/objectdata.h | 2 +- cpukit/include/rtems/score/threadimpl.h | 27 ++++++++++++++++++ cpukit/include/rtems/score/threadmp.h | 13 +++++++++ cpukit/include/rtems/score/threadqimpl.h | 18 ------------ cpukit/posix/src/psignalunblockthread.c | 16 +++++++---- cpukit/score/src/threadqextractwithproxy.c | 46 ++++++++++++++---------------- cpukit/score/src/threadrestart.c | 8 ++---- spec/build/cpukit/librtemscpu.yml | 1 - spec/build/cpukit/objmpci.yml | 1 + 9 files changed, 78 insertions(+), 54 deletions(-) diff --git a/cpukit/include/rtems/score/objectdata.h b/cpukit/include/rtems/score/objectdata.h index 149498df9c..c7fb33ca5b 100644 --- a/cpukit/include/rtems/score/objectdata.h +++ b/cpukit/include/rtems/score/objectdata.h @@ -286,7 +286,7 @@ struct Objects_Information { #if defined(RTEMS_MULTIPROCESSING) /** - * @brief This method is used by _Thread_queue_Extract_with_proxy(). + * @brief This method is used by _Thread_MP_Extract_proxy(). * * This member is statically initialized and read-only. */ diff --git a/cpukit/include/rtems/score/threadimpl.h b/cpukit/include/rtems/score/threadimpl.h index 931de2c6be..dc41d28856 100644 --- a/cpukit/include/rtems/score/threadimpl.h +++ b/cpukit/include/rtems/score/threadimpl.h @@ -2690,5 +2690,32 @@ RTEMS_INLINE_ROUTINE void _Thread_Unpin( #include #endif +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup RTEMSScoreThread + * + * @brief Removes the watchdog timer from the thread and lets the thread + * continue its execution. + * + * @param[in, out] the_thread is the thread. + */ +RTEMS_INLINE_ROUTINE void _Thread_Timer_remove_and_continue( + Thread_Control *the_thread +) +{ + _Thread_Timer_remove( the_thread ); +#if defined(RTEMS_MULTIPROCESSING) + _Thread_MP_Extract_proxy( the_thread ); +#endif + _Thread_queue_Extract( the_thread ); +} + +#ifdef __cplusplus +} +#endif + #endif /* end of include file */ diff --git a/cpukit/include/rtems/score/threadmp.h b/cpukit/include/rtems/score/threadmp.h index 6cc68e6320..e10661a573 100644 --- a/cpukit/include/rtems/score/threadmp.h +++ b/cpukit/include/rtems/score/threadmp.h @@ -97,6 +97,19 @@ Thread_Control *_Thread_MP_Find_proxy ( #define _Thread_MP_Is_receive(_the_thread) \ ((_the_thread) == _MPCI_Receive_server_tcb) +/** + * @brief Extracts the proxy of the thread if necessary. + * + * This routine ensures that if there is a proxy for this thread on another + * node, it is also dealt with. A proxy is a data that is on the thread queue + * on the remote node and acts as a proxy for the local thread. If the local + * thread was waiting on a remote operation, then the remote side of the + * operation must be cleaned up. + * + * @param[in, out] the_thread is the thread to determine the proxy. + */ +void _Thread_MP_Extract_proxy( Thread_Control *the_thread ); + /** * @brief Trees a proxy control block to the inactive chain of free proxy * control blocks. diff --git a/cpukit/include/rtems/score/threadqimpl.h b/cpukit/include/rtems/score/threadqimpl.h index 7e6f2665be..18317873c4 100644 --- a/cpukit/include/rtems/score/threadqimpl.h +++ b/cpukit/include/rtems/score/threadqimpl.h @@ -983,24 +983,6 @@ void _Thread_queue_Resume( */ void _Thread_queue_Extract( Thread_Control *the_thread ); -/** - * @brief Extracts the_thread from the_thread_queue. - * - * This routine extracts the_thread from the_thread_queue - * and ensures that if there is a proxy for this task on - * another node, it is also dealt with. A proxy is a data - * data that is on the thread queue on the remote node and - * acts as a proxy for the local thread. If the local thread - * was waiting on a remote operation, then the remote side - * of the operation must be cleaned up. - * - * @param[in, out] the_thread The pointer to a thread control block that - * is to be removed - */ -void _Thread_queue_Extract_with_proxy( - Thread_Control *the_thread -); - /** * @brief Surrenders the thread queue previously owned by the thread to the * first enqueued thread. diff --git a/cpukit/posix/src/psignalunblockthread.c b/cpukit/posix/src/psignalunblockthread.c index de814c13cd..1133234554 100644 --- a/cpukit/posix/src/psignalunblockthread.c +++ b/cpukit/posix/src/psignalunblockthread.c @@ -175,6 +175,15 @@ static bool _POSIX_signals_Unblock_thread_done( return status; } +static void _POSIX_signals_Interrupt_thread( Thread_Control *the_thread ) +{ +#if defined(RTEMS_MULTIPROCESSING) + _Thread_MP_Extract_proxy( the_thread ); +#endif + the_thread->Wait.return_code = STATUS_INTERRUPTED; + _Thread_queue_Extract( the_thread ); +} + bool _POSIX_signals_Unblock_thread( Thread_Control *the_thread, int signo, @@ -196,8 +205,6 @@ bool _POSIX_signals_Unblock_thread( if ( _States_Is_interruptible_signal( the_thread->current_state ) ) { if ( (the_thread->Wait.option & mask) || (api->signals_unblocked & mask) ) { - the_thread->Wait.return_code = STATUS_INTERRUPTED; - the_info = (siginfo_t *) the_thread->Wait.return_argument; if ( !info ) { @@ -208,7 +215,7 @@ bool _POSIX_signals_Unblock_thread( *the_info = *info; } - _Thread_queue_Extract_with_proxy( the_thread ); + _POSIX_signals_Interrupt_thread( the_thread ); return _POSIX_signals_Unblock_thread_done( the_thread, api, true ); } @@ -238,8 +245,7 @@ bool _POSIX_signals_Unblock_thread( */ if ( _States_Is_interruptible_by_signal( the_thread->current_state ) ) { - the_thread->Wait.return_code = STATUS_INTERRUPTED; - _Thread_queue_Extract_with_proxy( the_thread ); + _POSIX_signals_Interrupt_thread( the_thread ); } } return _POSIX_signals_Unblock_thread_done( the_thread, api, false ); diff --git a/cpukit/score/src/threadqextractwithproxy.c b/cpukit/score/src/threadqextractwithproxy.c index 1370aecb86..a61934a2b1 100644 --- a/cpukit/score/src/threadqextractwithproxy.c +++ b/cpukit/score/src/threadqextractwithproxy.c @@ -4,7 +4,7 @@ * @ingroup RTEMSScoreThreadQueue * * @brief This source file contains the implementation of - * _Thread_queue_Extract_with_proxy(). + * _Thread_MP_Extract_proxy(). */ /* @@ -20,32 +20,30 @@ #include "config.h" #endif -#include +#include #include #include -void _Thread_queue_Extract_with_proxy( - Thread_Control *the_thread -) +void _Thread_MP_Extract_proxy( Thread_Control *the_thread ) { - #if defined(RTEMS_MULTIPROCESSING) - States_Control state; - - state = the_thread->current_state; - if ( _States_Is_waiting_for_rpc_reply( state ) && - _States_Is_locally_blocked( state ) ) { - Objects_Id id; - Objects_Information *the_information; - Objects_Thread_queue_Extract_callout proxy_extract_callout; - - id = the_thread->Wait.remote_id; - the_information = _Objects_Get_information_id( id ); - proxy_extract_callout = the_information->extract; - - if ( proxy_extract_callout != NULL ) - (*proxy_extract_callout)( the_thread, id ); - } - #endif + States_Control state; + + state = the_thread->current_state; + + if ( + _States_Is_waiting_for_rpc_reply( state ) && + _States_Is_locally_blocked( state ) + ) { + Objects_Id id; + const Objects_Information *the_information; + Objects_Thread_queue_Extract_callout proxy_extract_callout; - _Thread_queue_Extract( the_thread ); + id = the_thread->Wait.remote_id; + the_information = _Objects_Get_information_id( id ); + proxy_extract_callout = the_information->extract; + + if ( proxy_extract_callout != NULL ) { + ( *proxy_extract_callout )( the_thread, id ); + } + } } diff --git a/cpukit/score/src/threadrestart.c b/cpukit/score/src/threadrestart.c index 12a0329a73..d469705d2c 100644 --- a/cpukit/score/src/threadrestart.c +++ b/cpukit/score/src/threadrestart.c @@ -137,8 +137,7 @@ static void _Thread_Make_zombie( Thread_Control *the_thread ) _Objects_Close( &information->Objects, &the_thread->Object ); _Thread_Set_state( the_thread, STATES_ZOMBIE ); - _Thread_Timer_remove( the_thread ); - _Thread_queue_Extract_with_proxy( the_thread ); + _Thread_Timer_remove_and_continue( the_thread ); /* * Add the thread to the thread zombie chain before we wake up joining @@ -358,7 +357,7 @@ static void _Thread_Remove_life_change_request( Thread_Control *the_thread ) * Do not remove states used for thread queues to avoid race conditions on * SMP configurations. We could interrupt an extract operation on another * processor disregarding the thread wait flags. Rely on - * _Thread_queue_Extract_with_proxy() for removal of these states. + * _Thread_queue_Extract() for removal of these states. */ _Thread_Clear_state_locked( the_thread, @@ -409,8 +408,7 @@ static void _Thread_Try_life_change_request( _Thread_Add_life_change_request( the_thread ); _Thread_State_release( the_thread, lock_context ); - _Thread_Timer_remove( the_thread ); - _Thread_queue_Extract_with_proxy( the_thread ); + _Thread_Timer_remove_and_continue( the_thread ); _Thread_Remove_life_change_request( the_thread ); } else { _Thread_Clear_state_locked( the_thread, STATES_SUSPENDED ); diff --git a/spec/build/cpukit/librtemscpu.yml b/spec/build/cpukit/librtemscpu.yml index 060ef273f4..b6ee8b9be8 100644 --- a/spec/build/cpukit/librtemscpu.yml +++ b/spec/build/cpukit/librtemscpu.yml @@ -1561,7 +1561,6 @@ source: - cpukit/score/src/threadplaindispatch.c - cpukit/score/src/threadq.c - cpukit/score/src/threadqenqueue.c -- cpukit/score/src/threadqextractwithproxy.c - cpukit/score/src/threadqfirst.c - cpukit/score/src/threadqflush.c - cpukit/score/src/threadqgetnameandid.c diff --git a/spec/build/cpukit/objmpci.yml b/spec/build/cpukit/objmpci.yml index 24cfca9888..0b9b5c61da 100644 --- a/spec/build/cpukit/objmpci.yml +++ b/spec/build/cpukit/objmpci.yml @@ -23,4 +23,5 @@ source: - cpukit/score/src/mpcidefault.c - cpukit/score/src/objectmp.c - cpukit/score/src/threadmp.c +- cpukit/score/src/threadqextractwithproxy.c type: build -- cgit v1.2.3