summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cpukit/include/rtems/score/status.h2
-rw-r--r--cpukit/include/rtems/score/threadimpl.h7
-rw-r--r--cpukit/posix/src/psignalunblockthread.c13
-rw-r--r--cpukit/score/src/threadrestart.c6
4 files changed, 12 insertions, 16 deletions
diff --git a/cpukit/include/rtems/score/status.h b/cpukit/include/rtems/score/status.h
index 236ae52d7b..96c0f1f9af 100644
--- a/cpukit/include/rtems/score/status.h
+++ b/cpukit/include/rtems/score/status.h
@@ -106,6 +106,8 @@ typedef enum {
STATUS_BUILD( STATUS_CLASSIC_INCORRECT_STATE, EINVAL ),
STATUS_INTERRUPTED =
STATUS_BUILD( STATUS_CLASSIC_INTERNAL_ERROR, EINTR ),
+ STATUS_INTERNAL_ERROR =
+ STATUS_BUILD( STATUS_CLASSIC_INTERNAL_ERROR, ENOTSUP ),
STATUS_INVALID_ADDRESS =
STATUS_BUILD( STATUS_CLASSIC_INVALID_ADDRESS, EFAULT ),
STATUS_INVALID_ID =
diff --git a/cpukit/include/rtems/score/threadimpl.h b/cpukit/include/rtems/score/threadimpl.h
index a66d1a5346..0a672aa837 100644
--- a/cpukit/include/rtems/score/threadimpl.h
+++ b/cpukit/include/rtems/score/threadimpl.h
@@ -2698,16 +2698,19 @@ extern "C" {
* continue its execution.
*
* @param[in, out] the_thread is the thread.
+ *
+ * @param status is the thread wait status.
*/
RTEMS_INLINE_ROUTINE void _Thread_Timer_remove_and_continue(
- Thread_Control *the_thread
+ Thread_Control *the_thread,
+ Status_Control status
)
{
_Thread_Timer_remove( the_thread );
#if defined(RTEMS_MULTIPROCESSING)
_Thread_MP_Extract_proxy( the_thread );
#endif
- _Thread_queue_Extract( the_thread );
+ _Thread_Continue( the_thread, status );
}
#ifdef __cplusplus
diff --git a/cpukit/posix/src/psignalunblockthread.c b/cpukit/posix/src/psignalunblockthread.c
index 1133234554..36680f99a2 100644
--- a/cpukit/posix/src/psignalunblockthread.c
+++ b/cpukit/posix/src/psignalunblockthread.c
@@ -175,15 +175,6 @@ 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,
@@ -215,7 +206,7 @@ bool _POSIX_signals_Unblock_thread(
*the_info = *info;
}
- _POSIX_signals_Interrupt_thread( the_thread );
+ _Thread_Timer_remove_and_continue( the_thread, STATUS_INTERRUPTED );
return _POSIX_signals_Unblock_thread_done( the_thread, api, true );
}
@@ -245,7 +236,7 @@ bool _POSIX_signals_Unblock_thread(
*/
if ( _States_Is_interruptible_by_signal( the_thread->current_state ) ) {
- _POSIX_signals_Interrupt_thread( the_thread );
+ _Thread_Timer_remove_and_continue( the_thread, STATUS_INTERRUPTED );
}
}
return _POSIX_signals_Unblock_thread_done( the_thread, api, false );
diff --git a/cpukit/score/src/threadrestart.c b/cpukit/score/src/threadrestart.c
index d469705d2c..90573dab07 100644
--- a/cpukit/score/src/threadrestart.c
+++ b/cpukit/score/src/threadrestart.c
@@ -137,7 +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_and_continue( the_thread );
+ _Thread_Timer_remove_and_continue( the_thread, STATUS_INTERNAL_ERROR );
/*
* Add the thread to the thread zombie chain before we wake up joining
@@ -357,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() for removal of these states.
+ * _Thread_Continue() for removal of these states.
*/
_Thread_Clear_state_locked(
the_thread,
@@ -408,7 +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_and_continue( the_thread );
+ _Thread_Timer_remove_and_continue( the_thread, STATUS_INTERNAL_ERROR );
_Thread_Remove_life_change_request( the_thread );
} else {
_Thread_Clear_state_locked( the_thread, STATES_SUSPENDED );