[PATCH 6/6] score: Properly continue the thread during restart

Gedare Bloom gedare at rtems.org
Sat Nov 20 16:59:28 UTC 2021


On Mon, Nov 15, 2021 at 10:09 AM Sebastian Huber
<sebastian.huber at 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 at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel


More information about the devel mailing list