forked from Imagelibrary/rtems
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.
This commit is contained in:
@@ -286,7 +286,7 @@ struct Objects_Information {
|
|||||||
|
|
||||||
#if defined(RTEMS_MULTIPROCESSING)
|
#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.
|
* This member is statically initialized and read-only.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -2690,5 +2690,32 @@ RTEMS_INLINE_ROUTINE void _Thread_Unpin(
|
|||||||
#include <rtems/score/threadmp.h>
|
#include <rtems/score/threadmp.h>
|
||||||
#endif
|
#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
|
#endif
|
||||||
/* end of include file */
|
/* end of include file */
|
||||||
|
|||||||
@@ -97,6 +97,19 @@ Thread_Control *_Thread_MP_Find_proxy (
|
|||||||
#define _Thread_MP_Is_receive(_the_thread) \
|
#define _Thread_MP_Is_receive(_the_thread) \
|
||||||
((_the_thread) == _MPCI_Receive_server_tcb)
|
((_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
|
* @brief Trees a proxy control block to the inactive chain of free proxy
|
||||||
* control blocks.
|
* control blocks.
|
||||||
|
|||||||
@@ -983,24 +983,6 @@ void _Thread_queue_Resume(
|
|||||||
*/
|
*/
|
||||||
void _Thread_queue_Extract( Thread_Control *the_thread );
|
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
|
* @brief Surrenders the thread queue previously owned by the thread to the
|
||||||
* first enqueued thread.
|
* first enqueued thread.
|
||||||
|
|||||||
@@ -175,6 +175,15 @@ static bool _POSIX_signals_Unblock_thread_done(
|
|||||||
return status;
|
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(
|
bool _POSIX_signals_Unblock_thread(
|
||||||
Thread_Control *the_thread,
|
Thread_Control *the_thread,
|
||||||
int signo,
|
int signo,
|
||||||
@@ -196,8 +205,6 @@ bool _POSIX_signals_Unblock_thread(
|
|||||||
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
|
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
|
||||||
|
|
||||||
if ( (the_thread->Wait.option & mask) || (api->signals_unblocked & mask) ) {
|
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;
|
the_info = (siginfo_t *) the_thread->Wait.return_argument;
|
||||||
|
|
||||||
if ( !info ) {
|
if ( !info ) {
|
||||||
@@ -208,7 +215,7 @@ bool _POSIX_signals_Unblock_thread(
|
|||||||
*the_info = *info;
|
*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 );
|
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 ) ) {
|
if ( _States_Is_interruptible_by_signal( the_thread->current_state ) ) {
|
||||||
the_thread->Wait.return_code = STATUS_INTERRUPTED;
|
_POSIX_signals_Interrupt_thread( the_thread );
|
||||||
_Thread_queue_Extract_with_proxy( the_thread );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return _POSIX_signals_Unblock_thread_done( the_thread, api, false );
|
return _POSIX_signals_Unblock_thread_done( the_thread, api, false );
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
* @ingroup RTEMSScoreThreadQueue
|
* @ingroup RTEMSScoreThreadQueue
|
||||||
*
|
*
|
||||||
* @brief This source file contains the implementation of
|
* @brief This source file contains the implementation of
|
||||||
* _Thread_queue_Extract_with_proxy().
|
* _Thread_MP_Extract_proxy().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -20,32 +20,30 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <rtems/score/threadqimpl.h>
|
#include <rtems/score/threadimpl.h>
|
||||||
#include <rtems/score/objectimpl.h>
|
#include <rtems/score/objectimpl.h>
|
||||||
#include <rtems/score/statesimpl.h>
|
#include <rtems/score/statesimpl.h>
|
||||||
|
|
||||||
void _Thread_queue_Extract_with_proxy(
|
void _Thread_MP_Extract_proxy( Thread_Control *the_thread )
|
||||||
Thread_Control *the_thread
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
#if defined(RTEMS_MULTIPROCESSING)
|
States_Control state;
|
||||||
States_Control state;
|
|
||||||
|
|
||||||
state = the_thread->current_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;
|
if (
|
||||||
the_information = _Objects_Get_information_id( id );
|
_States_Is_waiting_for_rpc_reply( state ) &&
|
||||||
proxy_extract_callout = the_information->extract;
|
_States_Is_locally_blocked( state )
|
||||||
|
) {
|
||||||
|
Objects_Id id;
|
||||||
|
const Objects_Information *the_information;
|
||||||
|
Objects_Thread_queue_Extract_callout proxy_extract_callout;
|
||||||
|
|
||||||
if ( proxy_extract_callout != NULL )
|
id = the_thread->Wait.remote_id;
|
||||||
(*proxy_extract_callout)( the_thread, 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
|
}
|
||||||
|
|
||||||
_Thread_queue_Extract( the_thread );
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -137,8 +137,7 @@ static void _Thread_Make_zombie( Thread_Control *the_thread )
|
|||||||
_Objects_Close( &information->Objects, &the_thread->Object );
|
_Objects_Close( &information->Objects, &the_thread->Object );
|
||||||
|
|
||||||
_Thread_Set_state( the_thread, STATES_ZOMBIE );
|
_Thread_Set_state( the_thread, STATES_ZOMBIE );
|
||||||
_Thread_Timer_remove( the_thread );
|
_Thread_Timer_remove_and_continue( the_thread );
|
||||||
_Thread_queue_Extract_with_proxy( the_thread );
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add the thread to the thread zombie chain before we wake up joining
|
* 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
|
* Do not remove states used for thread queues to avoid race conditions on
|
||||||
* SMP configurations. We could interrupt an extract operation on another
|
* SMP configurations. We could interrupt an extract operation on another
|
||||||
* processor disregarding the thread wait flags. Rely on
|
* 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(
|
_Thread_Clear_state_locked(
|
||||||
the_thread,
|
the_thread,
|
||||||
@@ -409,8 +408,7 @@ static void _Thread_Try_life_change_request(
|
|||||||
_Thread_Add_life_change_request( the_thread );
|
_Thread_Add_life_change_request( the_thread );
|
||||||
_Thread_State_release( the_thread, lock_context );
|
_Thread_State_release( the_thread, lock_context );
|
||||||
|
|
||||||
_Thread_Timer_remove( the_thread );
|
_Thread_Timer_remove_and_continue( the_thread );
|
||||||
_Thread_queue_Extract_with_proxy( the_thread );
|
|
||||||
_Thread_Remove_life_change_request( the_thread );
|
_Thread_Remove_life_change_request( the_thread );
|
||||||
} else {
|
} else {
|
||||||
_Thread_Clear_state_locked( the_thread, STATES_SUSPENDED );
|
_Thread_Clear_state_locked( the_thread, STATES_SUSPENDED );
|
||||||
|
|||||||
@@ -1561,7 +1561,6 @@ source:
|
|||||||
- cpukit/score/src/threadplaindispatch.c
|
- cpukit/score/src/threadplaindispatch.c
|
||||||
- cpukit/score/src/threadq.c
|
- cpukit/score/src/threadq.c
|
||||||
- cpukit/score/src/threadqenqueue.c
|
- cpukit/score/src/threadqenqueue.c
|
||||||
- cpukit/score/src/threadqextractwithproxy.c
|
|
||||||
- cpukit/score/src/threadqfirst.c
|
- cpukit/score/src/threadqfirst.c
|
||||||
- cpukit/score/src/threadqflush.c
|
- cpukit/score/src/threadqflush.c
|
||||||
- cpukit/score/src/threadqgetnameandid.c
|
- cpukit/score/src/threadqgetnameandid.c
|
||||||
|
|||||||
@@ -23,4 +23,5 @@ source:
|
|||||||
- cpukit/score/src/mpcidefault.c
|
- cpukit/score/src/mpcidefault.c
|
||||||
- cpukit/score/src/objectmp.c
|
- cpukit/score/src/objectmp.c
|
||||||
- cpukit/score/src/threadmp.c
|
- cpukit/score/src/threadmp.c
|
||||||
|
- cpukit/score/src/threadqextractwithproxy.c
|
||||||
type: build
|
type: build
|
||||||
|
|||||||
Reference in New Issue
Block a user