On Mon, Nov 15, 2021 at 10:09 AM Sebastian Huber <sebastian.hu...@embedded-brains.de> wrote: > > The _Thread_queue_Extract() does not deal with potential priority > updates and the SMP locking protocol handling. Use > _Thread_queue_Continue(). For the POSIX signals processing this is > currently probably unnecessary, however, the use case is similar to the > restart so use the same appoach. > > Close #4546. > --- > cpukit/include/rtems/score/status.h | 2 ++ > cpukit/posix/src/psignalunblockthread.c | 4 ++-- > cpukit/score/src/threadrestart.c | 4 ++-- > 3 files changed, 6 insertions(+), 4 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/posix/src/psignalunblockthread.c > b/cpukit/posix/src/psignalunblockthread.c > index 1133234554..6921c14e46 100644 > --- a/cpukit/posix/src/psignalunblockthread.c > +++ b/cpukit/posix/src/psignalunblockthread.c > @@ -180,8 +180,8 @@ 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 ); > + _Thread_Timer_remove( the_thread ); > + _Thread_Continue( the_thread, STATUS_INTERRUPTED ); > } > It seems the same argument applies here that we should remove the timer as early as possible to avoid spurious timeouts?
> bool _POSIX_signals_Unblock_thread( > diff --git a/cpukit/score/src/threadrestart.c > b/cpukit/score/src/threadrestart.c > index 6423c421b4..657892931e 100644 > --- a/cpukit/score/src/threadrestart.c > +++ b/cpukit/score/src/threadrestart.c > @@ -118,7 +118,7 @@ static void _Thread_Remove_timer_and_continue( > Thread_Control *the_thread ) > #if defined(RTEMS_MULTIPROCESSING) > _Thread_MP_Extract_proxy( the_thread ); > #endif > - _Thread_queue_Extract( the_thread ); > + _Thread_Continue( the_thread, STATUS_INTERNAL_ERROR ); > } > Both of the above functions are very similar to each other. Consider refactoring so they (once again) share the same code? The only difference appears to be the status they pass to Thread_Continue(). Just a thought. > static void _Thread_Add_to_zombie_registry( Thread_Control *the_thread ) > @@ -366,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() for removal of these states. > + * _Thread_Continue() for removal of these states. > */ > _Thread_Clear_state_locked( > the_thread, > -- > 2.26.2 > > _______________________________________________ > devel mailing list > devel@rtems.org > http://lists.rtems.org/mailman/listinfo/devel _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel