[PATCH 2/6] score: Add _Thread_MP_Extract_proxy()
Sebastian Huber
sebastian.huber at embedded-brains.de
Mon Nov 15 17:08:56 UTC 2021
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/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 | 17 +++++---
spec/build/cpukit/librtemscpu.yml | 1 -
spec/build/cpukit/objmpci.yml | 1 +
8 files changed, 60 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/threadmp.h b/cpukit/include/rtems/score/threadmp.h
index 6cc68e6320..81a22e665e 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 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 <rtems/score/threadqimpl.h>
+#include <rtems/score/threadimpl.h>
#include <rtems/score/objectimpl.h>
#include <rtems/score/statesimpl.h>
-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..6423c421b4 100644
--- a/cpukit/score/src/threadrestart.c
+++ b/cpukit/score/src/threadrestart.c
@@ -112,6 +112,15 @@ static void _Thread_Wake_up_joining_threads( Thread_Control *the_thread )
);
}
+static void _Thread_Remove_timer_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 );
+}
+
static void _Thread_Add_to_zombie_registry( Thread_Control *the_thread )
{
ISR_lock_Context lock_context;
@@ -137,8 +146,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_Remove_timer_and_continue( the_thread );
/*
* Add the thread to the thread zombie chain before we wake up joining
@@ -358,7 +366,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 +417,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_Remove_timer_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 819c479191..02be1a43ea 100644
--- a/spec/build/cpukit/librtemscpu.yml
+++ b/spec/build/cpukit/librtemscpu.yml
@@ -1559,7 +1559,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
--
2.26.2
More information about the devel
mailing list