/* SPDX-License-Identifier: BSD-2-Clause */ /** * @file * * @ingroup RtemsTaskReqRestart */ /* * Copyright (C) 2021 embedded brains GmbH & Co. KG * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * This file is part of the RTEMS quality process and was automatically * generated. If you find something that needs to be fixed or * worded better please post a report or patch to an RTEMS mailing list * or raise a bug report: * * https://www.rtems.org/bugs.html * * For information on updating and regenerating please refer to the How-To * section in the Software Requirements Engineering chapter of the * RTEMS Software Engineering manual. The manual is provided as a part of * a release. For development sources please refer to the online * documentation at: * * https://docs.rtems.org */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include "tx-support.h" #include /** * @defgroup RtemsTaskReqRestart spec:/rtems/task/req/restart * * @ingroup TestsuitesValidationNoClock0 * * @{ */ typedef enum { RtemsTaskReqRestart_Pre_Id_Invalid, RtemsTaskReqRestart_Pre_Id_Executing, RtemsTaskReqRestart_Pre_Id_Other, RtemsTaskReqRestart_Pre_Id_NA } RtemsTaskReqRestart_Pre_Id; typedef enum { RtemsTaskReqRestart_Pre_Dormant_Yes, RtemsTaskReqRestart_Pre_Dormant_No, RtemsTaskReqRestart_Pre_Dormant_NA } RtemsTaskReqRestart_Pre_Dormant; typedef enum { RtemsTaskReqRestart_Pre_Suspended_Yes, RtemsTaskReqRestart_Pre_Suspended_No, RtemsTaskReqRestart_Pre_Suspended_NA } RtemsTaskReqRestart_Pre_Suspended; typedef enum { RtemsTaskReqRestart_Pre_Restarting_Yes, RtemsTaskReqRestart_Pre_Restarting_No, RtemsTaskReqRestart_Pre_Restarting_NA } RtemsTaskReqRestart_Pre_Restarting; typedef enum { RtemsTaskReqRestart_Pre_Terminating_Yes, RtemsTaskReqRestart_Pre_Terminating_No, RtemsTaskReqRestart_Pre_Terminating_NA } RtemsTaskReqRestart_Pre_Terminating; typedef enum { RtemsTaskReqRestart_Pre_Protected_Yes, RtemsTaskReqRestart_Pre_Protected_No, RtemsTaskReqRestart_Pre_Protected_NA } RtemsTaskReqRestart_Pre_Protected; typedef enum { RtemsTaskReqRestart_Pre_Context_Task, RtemsTaskReqRestart_Pre_Context_Interrupt, RtemsTaskReqRestart_Pre_Context_NestedRequest, RtemsTaskReqRestart_Pre_Context_NA } RtemsTaskReqRestart_Pre_Context; typedef enum { RtemsTaskReqRestart_Pre_State_Ready, RtemsTaskReqRestart_Pre_State_Blocked, RtemsTaskReqRestart_Pre_State_Enqueued, RtemsTaskReqRestart_Pre_State_NA } RtemsTaskReqRestart_Pre_State; typedef enum { RtemsTaskReqRestart_Pre_Timer_Inactive, RtemsTaskReqRestart_Pre_Timer_Active, RtemsTaskReqRestart_Pre_Timer_NA } RtemsTaskReqRestart_Pre_Timer; typedef enum { RtemsTaskReqRestart_Pre_RealPriority_Initial, RtemsTaskReqRestart_Pre_RealPriority_Changed, RtemsTaskReqRestart_Pre_RealPriority_NA } RtemsTaskReqRestart_Pre_RealPriority; typedef enum { RtemsTaskReqRestart_Pre_ThreadDispatch_Disabled, RtemsTaskReqRestart_Pre_ThreadDispatch_Enabled, RtemsTaskReqRestart_Pre_ThreadDispatch_NA } RtemsTaskReqRestart_Pre_ThreadDispatch; typedef enum { RtemsTaskReqRestart_Post_Status_Ok, RtemsTaskReqRestart_Post_Status_InvId, RtemsTaskReqRestart_Post_Status_IncStat, RtemsTaskReqRestart_Post_Status_NoReturn, RtemsTaskReqRestart_Post_Status_NA } RtemsTaskReqRestart_Post_Status; typedef enum { RtemsTaskReqRestart_Post_FatalError_Yes, RtemsTaskReqRestart_Post_FatalError_Nop, RtemsTaskReqRestart_Post_FatalError_NA } RtemsTaskReqRestart_Post_FatalError; typedef enum { RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_Argument_Nop, RtemsTaskReqRestart_Post_Argument_NA } RtemsTaskReqRestart_Post_Argument; typedef enum { RtemsTaskReqRestart_Post_State_Dormant, RtemsTaskReqRestart_Post_State_DormantSuspended, RtemsTaskReqRestart_Post_State_Blocked, RtemsTaskReqRestart_Post_State_Ready, RtemsTaskReqRestart_Post_State_Zombie, RtemsTaskReqRestart_Post_State_Nop, RtemsTaskReqRestart_Post_State_NA } RtemsTaskReqRestart_Post_State; typedef enum { RtemsTaskReqRestart_Post_Enqueued_Yes, RtemsTaskReqRestart_Post_Enqueued_No, RtemsTaskReqRestart_Post_Enqueued_NA } RtemsTaskReqRestart_Post_Enqueued; typedef enum { RtemsTaskReqRestart_Post_Timer_Active, RtemsTaskReqRestart_Post_Timer_Inactive, RtemsTaskReqRestart_Post_Timer_NA } RtemsTaskReqRestart_Post_Timer; typedef enum { RtemsTaskReqRestart_Post_Restarting_Yes, RtemsTaskReqRestart_Post_Restarting_No, RtemsTaskReqRestart_Post_Restarting_NA } RtemsTaskReqRestart_Post_Restarting; typedef enum { RtemsTaskReqRestart_Post_Terminating_Yes, RtemsTaskReqRestart_Post_Terminating_No, RtemsTaskReqRestart_Post_Terminating_NA } RtemsTaskReqRestart_Post_Terminating; typedef enum { RtemsTaskReqRestart_Post_Protected_Yes, RtemsTaskReqRestart_Post_Protected_No, RtemsTaskReqRestart_Post_Protected_NA } RtemsTaskReqRestart_Post_Protected; typedef enum { RtemsTaskReqRestart_Post_RestartExtensions_Yes, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_RestartExtensions_NA } RtemsTaskReqRestart_Post_RestartExtensions; typedef enum { RtemsTaskReqRestart_Post_TerminateExtensions_Yes, RtemsTaskReqRestart_Post_TerminateExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_NA } RtemsTaskReqRestart_Post_TerminateExtensions; typedef struct { uint64_t Skip : 1; uint64_t Pre_Id_NA : 1; uint64_t Pre_Dormant_NA : 1; uint64_t Pre_Suspended_NA : 1; uint64_t Pre_Restarting_NA : 1; uint64_t Pre_Terminating_NA : 1; uint64_t Pre_Protected_NA : 1; uint64_t Pre_Context_NA : 1; uint64_t Pre_State_NA : 1; uint64_t Pre_Timer_NA : 1; uint64_t Pre_RealPriority_NA : 1; uint64_t Pre_ThreadDispatch_NA : 1; uint64_t Post_Status : 3; uint64_t Post_FatalError : 2; uint64_t Post_Argument : 2; uint64_t Post_State : 3; uint64_t Post_Enqueued : 2; uint64_t Post_Timer : 2; uint64_t Post_Restarting : 2; uint64_t Post_Terminating : 2; uint64_t Post_Protected : 2; uint64_t Post_RestartExtensions : 2; uint64_t Post_TerminateExtensions : 2; } RtemsTaskReqRestart_Entry; /** * @brief Test context for spec:/rtems/task/req/restart test case. */ typedef struct { /** * @brief This member provides the scheduler operation records. */ T_scheduler_log_10 scheduler_log; /** * @brief This member provides a jump context to resume a thread dispatch. */ jmp_buf thread_dispatch_context; /** * @brief This member provides the context to wrap thread queue operations. */ WrapThreadQueueContext wrap_tq_ctx; /** * @brief This member contains the identifier of the runner scheduler. */ rtems_id scheduler_id; /** * @brief This member contains the identifier of the runner task. */ rtems_id runner_id; /** * @brief This member contains the identifier of the mutex. */ rtems_id mutex_id; /** * @brief This member provides an event set used to set up the blocking * conditions of the task to restart. */ rtems_event_set events; /** * @brief This member contains the identifier of the worker task. */ rtems_id worker_id; /** * @brief This member references the TCB of the worker task. */ rtems_tcb *worker_tcb; /** * @brief This member contains the worker state at the end of the * rtems_task_restart() call. */ States_Control worker_state; /** * @brief This member contains the worker thread life state at the end of the * rtems_task_restart() call. */ Thread_Life_state worker_life_state; /** * @brief This member contains the identifier of the deleter task. */ rtems_id deleter_id; /** * @brief This member references the TCB of the deleter task. */ rtems_tcb *deleter_tcb; /** * @brief This member contains the identifier of the test user extensions. */ rtems_id extension_id; /** * @brief This member contains extension calls. */ ExtensionCalls calls; /** * @brief This member contains extension calls after the rtems_task_restart() * call. */ ExtensionCalls calls_after_restart; /** * @brief This member contains the actual argument passed to the entry point. */ rtems_task_argument actual_argument; /** * @brief This member contains the restart counter. */ uint32_t restart_counter; /** * @brief If this member is true, then the worker shall be dormant before the * rtems_task_restart() call. */ bool dormant; /** * @brief If this member is true, then the worker shall be suspended before * the rtems_task_restart() call. */ bool suspended; /** * @brief If this member is true, then the thread life of the worker shall be * protected before the rtems_task_restart() call. */ bool protected; /** * @brief If this member is true, then the worker shall be restarting before * the rtems_task_restart() call. */ bool restarting; /** * @brief If this member is true, then the worker shall be terminating before * the rtems_task_restart() call. */ bool terminating; /** * @brief If this member is true, then the rtems_task_restart() shall be * called from within interrupt context. */ bool interrupt; /** * @brief If this member is true, then the rtems_task_restart() shall be * called during another rtems_task_restart() call with the same task as a * nested request. */ bool nested_request; /** * @brief If this member is true, then the worker shall be blocked before the * rtems_task_restart() call. */ bool blocked; /** * @brief If this member is true, then the worker shall be enqueued on a wait * queue before the rtems_task_restart() call. */ bool enqueued; /** * @brief If this member is true, then the timer of the worker shall be * active before the rtems_task_restart() call. */ bool timer_active; /** * @brief If this member is true, then the real priority of the worker shall * be equal to its initial priority before the rtems_task_restart() call. */ bool real_priority_is_initial; /** * @brief If this member is true, then thread dispatching is disabled by the * worker task before the rtems_task_restart() call. */ bool dispatch_disabled; /** * @brief If this member is true, then it is expected to delete the worker. */ bool delete_worker_expected; /** * @brief This member contains the return value of the rtems_task_restart() * call. */ rtems_status_code status; /** * @brief This member specifies if the ``id`` parameter value. */ rtems_id id; struct { /** * @brief This member defines the pre-condition indices for the next * action. */ size_t pci[ 11 ]; /** * @brief This member defines the pre-condition states for the next action. */ size_t pcs[ 11 ]; /** * @brief If this member is true, then the test action loop is executed. */ bool in_action_loop; /** * @brief This member contains the next transition map index. */ size_t index; /** * @brief This member contains the current transition map entry. */ RtemsTaskReqRestart_Entry entry; /** * @brief If this member is true, then the current transition variant * should be skipped. */ bool skip; } Map; } RtemsTaskReqRestart_Context; static RtemsTaskReqRestart_Context RtemsTaskReqRestart_Instance; static const char * const RtemsTaskReqRestart_PreDesc_Id[] = { "Invalid", "Executing", "Other", "NA" }; static const char * const RtemsTaskReqRestart_PreDesc_Dormant[] = { "Yes", "No", "NA" }; static const char * const RtemsTaskReqRestart_PreDesc_Suspended[] = { "Yes", "No", "NA" }; static const char * const RtemsTaskReqRestart_PreDesc_Restarting[] = { "Yes", "No", "NA" }; static const char * const RtemsTaskReqRestart_PreDesc_Terminating[] = { "Yes", "No", "NA" }; static const char * const RtemsTaskReqRestart_PreDesc_Protected[] = { "Yes", "No", "NA" }; static const char * const RtemsTaskReqRestart_PreDesc_Context[] = { "Task", "Interrupt", "NestedRequest", "NA" }; static const char * const RtemsTaskReqRestart_PreDesc_State[] = { "Ready", "Blocked", "Enqueued", "NA" }; static const char * const RtemsTaskReqRestart_PreDesc_Timer[] = { "Inactive", "Active", "NA" }; static const char * const RtemsTaskReqRestart_PreDesc_RealPriority[] = { "Initial", "Changed", "NA" }; static const char * const RtemsTaskReqRestart_PreDesc_ThreadDispatch[] = { "Disabled", "Enabled", "NA" }; static const char * const * const RtemsTaskReqRestart_PreDesc[] = { RtemsTaskReqRestart_PreDesc_Id, RtemsTaskReqRestart_PreDesc_Dormant, RtemsTaskReqRestart_PreDesc_Suspended, RtemsTaskReqRestart_PreDesc_Restarting, RtemsTaskReqRestart_PreDesc_Terminating, RtemsTaskReqRestart_PreDesc_Protected, RtemsTaskReqRestart_PreDesc_Context, RtemsTaskReqRestart_PreDesc_State, RtemsTaskReqRestart_PreDesc_Timer, RtemsTaskReqRestart_PreDesc_RealPriority, RtemsTaskReqRestart_PreDesc_ThreadDispatch, NULL }; #if CPU_SIZEOF_POINTER > 4 #define RESTART_ARGUMENT 0xfedcba0987654321U #else #define RESTART_ARGUMENT 0x87654321U #endif #define UNSET_ARGUMENT 1 typedef RtemsTaskReqRestart_Context Context; static void PrepareRealPriority( Context *ctx ) { if ( !ctx->real_priority_is_initial ) { SetScheduler( ctx->worker_id, ctx->scheduler_id, PRIO_LOW ); SetPriority( ctx->worker_id, PRIO_NORMAL ); } } static void CaptureWorkerState( Context *ctx ) { T_scheduler_log *log; log = T_scheduler_record( NULL ); if ( log != NULL ) { T_eq_ptr( &log->header, &ctx->scheduler_log.header ); ctx->worker_state = ctx->worker_tcb->current_state; ctx->worker_life_state = ctx->worker_tcb->Life.state; CopyExtensionCalls( &ctx->calls, &ctx->calls_after_restart ); } } static void VerifyTaskPreparation( const Context *ctx ) { if ( ctx->id != INVALID_ID ) { States_Control state; Thread_Life_state life_state; state = STATES_READY; life_state = ctx->worker_tcb->Life.state; if ( ctx->suspended ) { state |= STATES_SUSPENDED; } if ( ctx->dormant ) { T_eq_int( life_state, 0 ); state |= STATES_DORMANT; } else { T_eq( ctx->protected, ( life_state & THREAD_LIFE_PROTECTED ) != 0 ); T_eq( ctx->restarting, ( life_state & THREAD_LIFE_RESTARTING ) != 0 ); T_eq( ctx->terminating, ( life_state & THREAD_LIFE_TERMINATING ) != 0 ); if ( ctx->blocked ) { if ( ctx->enqueued ) { state |= STATES_WAITING_FOR_MUTEX; } else { state |= STATES_WAITING_FOR_EVENT; } } if ( ctx->nested_request ) { state |= STATES_LIFE_IS_CHANGING; } } T_eq_u32( ctx->worker_tcb->current_state, state ); } } static void Restart( void *arg ) { Context *ctx; T_scheduler_log *log; ctx = arg; if ( ctx->suspended && ctx->id != INVALID_ID ) { if ( ctx->id != RTEMS_SELF || ctx->interrupt ) { SuspendTask( ctx->worker_id ); } else { Per_CPU_Control *cpu_self; /* * Where the system was built with SMP support enabled, a suspended * executing thread during the rtems_task_restart() call can happen * if the thread was suspended by another processor and the * inter-processor interrupt did not yet arrive. Where the system was * built with SMP support disabled, this state cannot happen with the * current implementation. However, we still specify and validate this * behaviour unconditionally since there exist alternative * implementations which would lead to such a state if the executing * thread is suspended by an ISR. */ cpu_self = _Thread_Dispatch_disable(); SuspendSelf(); cpu_self->dispatch_necessary = false; _Thread_Dispatch_enable( cpu_self ); } } if ( ctx->dispatch_disabled ) { _Thread_Dispatch_disable(); } VerifyTaskPreparation( ctx ); ClearExtensionCalls( &ctx->calls ); log = T_scheduler_record_10( &ctx->scheduler_log ); T_null( log ); ctx->status = rtems_task_restart( ctx->id, RESTART_ARGUMENT ); CaptureWorkerState( ctx ); if ( ctx->dispatch_disabled ) { _Thread_Dispatch_enable( _Per_CPU_Get() ); } } static void Block( Context *ctx ) { rtems_interval ticks; if ( ctx->timer_active ) { ticks = UINT32_MAX; } else { ticks = RTEMS_NO_TIMEOUT; } if ( ctx->enqueued ) { ObtainMutexTimed( ctx->mutex_id, ticks ); } else { /* * Do not use a stack variable for the event set, since we may jump out * of the directive call. */ (void) rtems_event_receive( RTEMS_ALL_EVENTS, RTEMS_EVENT_ANY | RTEMS_WAIT, ticks, &ctx->events ); } } static void BlockDone( const Context *ctx ) { if ( ctx->enqueued ) { ReleaseMutex( ctx->mutex_id ); } } static void Fatal( rtems_fatal_source source, rtems_fatal_code code, void *arg ) { Context *ctx; Per_CPU_Control *cpu_self; T_eq_int( source, INTERNAL_ERROR_CORE ); T_eq_ulong( code, INTERNAL_ERROR_BAD_THREAD_DISPATCH_DISABLE_LEVEL ); ctx = arg; ++ctx->calls.fatal; T_assert_eq_int( ctx->calls.fatal, 1 ); CaptureWorkerState( ctx ); cpu_self = _Per_CPU_Get(); _Thread_Dispatch_unnest( cpu_self ); _Thread_Dispatch_direct_no_return( cpu_self ); } static void ResumeThreadDispatch( rtems_fatal_source source, rtems_fatal_code code, void *arg ) { Context *ctx; T_eq_int( source, INTERNAL_ERROR_CORE ); T_eq_ulong( code, INTERNAL_ERROR_BAD_THREAD_DISPATCH_DISABLE_LEVEL ); ctx = arg; SetFatalHandler( Fatal, ctx ); longjmp( ctx->thread_dispatch_context, 1 ); } static void TriggerNestedRequestViaSelfRestart( Context *ctx, Per_CPU_Control *cpu_self ) { WrapThreadQueueExtract( &ctx->wrap_tq_ctx, ctx->worker_tcb ); SetFatalHandler( ResumeThreadDispatch, ctx ); if ( setjmp( ctx->thread_dispatch_context ) == 0 ) { (void) rtems_task_restart( RTEMS_SELF, (rtems_task_argument) ctx ); } else { _Thread_Dispatch_unnest( cpu_self ); } } static void Signal( rtems_signal_set signals ) { Context *ctx; (void) signals; ctx = T_fixture_context(); if ( ctx->id == RTEMS_SELF ) { Per_CPU_Control *cpu_self; SetPriority( ctx->runner_id, PRIO_VERY_LOW ); SetPriority( ctx->deleter_id, PRIO_VERY_LOW ); if ( ctx->interrupt || ctx->nested_request ) { if ( ctx->blocked ) { SetFatalHandler( ResumeThreadDispatch, ctx ); cpu_self = _Thread_Dispatch_disable(); if ( setjmp( ctx->thread_dispatch_context ) == 0 ) { Block( ctx ); } else { _Thread_Dispatch_unnest( cpu_self ); } if ( ctx->interrupt ) { CallWithinISR( Restart, ctx ); } else { TriggerNestedRequestViaSelfRestart( ctx, cpu_self ); } _Thread_Dispatch_direct( cpu_self ); BlockDone( ctx ); } else { if ( ctx->interrupt ) { CallWithinISR( Restart, ctx ); } else { cpu_self = _Thread_Dispatch_disable(); TriggerNestedRequestViaSelfRestart( ctx, cpu_self ); _Thread_Dispatch_direct( cpu_self ); } } } else { Restart( ctx ); } } else { if ( ctx->blocked ) { Block( ctx ); BlockDone( ctx ); } else if ( ctx->nested_request ) { Yield(); } else { SetPriority( ctx->runner_id, PRIO_VERY_HIGH ); } } if ( ctx->protected ) { _Thread_Set_life_protection( 0 ); } } static void Deleter( rtems_task_argument arg ) { Context *ctx; ctx = (Context *) arg; if ( ctx != NULL ) { if ( ctx->real_priority_is_initial ) { /* * We have to prevent a potential priority boost in the task delete * below. */ if ( ctx->nested_request ) { /* Lower the priority to PRIO_NORMAL without an * implicit yield */ SetSelfPriorityNoYield( PRIO_NORMAL ); } else { SetScheduler( ctx->worker_id, ctx->scheduler_id, PRIO_HIGH ); } } if ( ctx->nested_request ) { WrapThreadQueueExtract( &ctx->wrap_tq_ctx, ctx->worker_tcb ); DeleteTask( ctx->worker_id ); } else { DeleteTask( ctx->worker_id ); } } SuspendSelf(); } static void Worker( rtems_task_argument arg ) { Context *ctx; rtems_status_code sc; ctx = T_fixture_context(); if ( arg == 0 ) { sc = rtems_signal_catch( Signal, RTEMS_NO_ASR ); T_rsc_success( sc ); if ( ctx->protected ) { _Thread_Set_life_protection( THREAD_LIFE_PROTECTED ); } Yield(); } else { ctx->actual_argument = arg; ++ctx->restart_counter; CaptureWorkerState( ctx ); SuspendSelf(); } } static void ThreadDelete( rtems_tcb *executing, rtems_tcb *deleted ) { Context *ctx; ctx = T_fixture_context(); ++ctx->calls.thread_delete; T_eq_u32( executing->Object.id, ctx->runner_id ); if ( ctx->delete_worker_expected ) { T_eq_u32( deleted->Object.id, ctx->worker_id ); } } static void ThreadRestart( rtems_tcb *executing, rtems_tcb *restarted ) { Context *ctx; ctx = T_fixture_context(); ++ctx->calls.thread_restart; } static void ThreadTerminate( rtems_tcb *executing ) { Context *ctx; ctx = T_fixture_context(); ++ctx->calls.thread_terminate; T_eq_u32( executing->Object.id, ctx->worker_id ); } static const rtems_extensions_table extensions = { .thread_delete = ThreadDelete, .thread_restart = ThreadRestart, .thread_terminate = ThreadTerminate }; static void RtemsTaskReqRestart_Pre_Id_Prepare( RtemsTaskReqRestart_Context *ctx, RtemsTaskReqRestart_Pre_Id state ) { switch ( state ) { case RtemsTaskReqRestart_Pre_Id_Invalid: { /* * While the ``id`` parameter is not associated with a task. */ ctx->id = INVALID_ID; break; } case RtemsTaskReqRestart_Pre_Id_Executing: { /* * While the ``id`` parameter is associated with the calling task. */ ctx->id = RTEMS_SELF; break; } case RtemsTaskReqRestart_Pre_Id_Other: { /* * While the ``id`` parameter is associated with a task other than the * calling task. */ ctx->id = ctx->worker_id; break; } case RtemsTaskReqRestart_Pre_Id_NA: break; } } static void RtemsTaskReqRestart_Pre_Dormant_Prepare( RtemsTaskReqRestart_Context *ctx, RtemsTaskReqRestart_Pre_Dormant state ) { switch ( state ) { case RtemsTaskReqRestart_Pre_Dormant_Yes: { /* * While the task specified by the ``id`` parameter is dormant. */ ctx->dormant = true; break; } case RtemsTaskReqRestart_Pre_Dormant_No: { /* * While the task specified by the ``id`` parameter is not dormant. */ ctx->dormant = false; break; } case RtemsTaskReqRestart_Pre_Dormant_NA: break; } } static void RtemsTaskReqRestart_Pre_Suspended_Prepare( RtemsTaskReqRestart_Context *ctx, RtemsTaskReqRestart_Pre_Suspended state ) { switch ( state ) { case RtemsTaskReqRestart_Pre_Suspended_Yes: { /* * While the task specified by the ``id`` parameter is suspended. */ ctx->suspended = true; break; } case RtemsTaskReqRestart_Pre_Suspended_No: { /* * While the task specified by the ``id`` parameter is not suspended. */ ctx->suspended = false; break; } case RtemsTaskReqRestart_Pre_Suspended_NA: break; } } static void RtemsTaskReqRestart_Pre_Restarting_Prepare( RtemsTaskReqRestart_Context *ctx, RtemsTaskReqRestart_Pre_Restarting state ) { switch ( state ) { case RtemsTaskReqRestart_Pre_Restarting_Yes: { /* * While the task specified by the ``id`` parameter is restarting. */ ctx->restarting = true; break; } case RtemsTaskReqRestart_Pre_Restarting_No: { /* * While the task specified by the ``id`` parameter is not restarting. */ ctx->restarting = false; break; } case RtemsTaskReqRestart_Pre_Restarting_NA: break; } } static void RtemsTaskReqRestart_Pre_Terminating_Prepare( RtemsTaskReqRestart_Context *ctx, RtemsTaskReqRestart_Pre_Terminating state ) { switch ( state ) { case RtemsTaskReqRestart_Pre_Terminating_Yes: { /* * While the task specified by the ``id`` parameter is terminating. */ ctx->terminating = true; break; } case RtemsTaskReqRestart_Pre_Terminating_No: { /* * While the task specified by the ``id`` parameter is not terminating. */ ctx->terminating = false; break; } case RtemsTaskReqRestart_Pre_Terminating_NA: break; } } static void RtemsTaskReqRestart_Pre_Protected_Prepare( RtemsTaskReqRestart_Context *ctx, RtemsTaskReqRestart_Pre_Protected state ) { switch ( state ) { case RtemsTaskReqRestart_Pre_Protected_Yes: { /* * While thread life of the task specified by the ``id`` parameter is * protected. */ ctx->protected = true; break; } case RtemsTaskReqRestart_Pre_Protected_No: { /* * While thread life of the task specified by the ``id`` parameter is not * protected. */ ctx->protected = false; break; } case RtemsTaskReqRestart_Pre_Protected_NA: break; } } static void RtemsTaskReqRestart_Pre_Context_Prepare( RtemsTaskReqRestart_Context *ctx, RtemsTaskReqRestart_Pre_Context state ) { switch ( state ) { case RtemsTaskReqRestart_Pre_Context_Task: { /* * While the rtems_task_restart() directive is called from within task * context. */ ctx->interrupt = false; ctx->nested_request = false; break; } case RtemsTaskReqRestart_Pre_Context_Interrupt: { /* * While the rtems_task_restart() directive is called from within * interrupt context. */ ctx->interrupt = true; ctx->nested_request = false; break; } case RtemsTaskReqRestart_Pre_Context_NestedRequest: { /* * While the rtems_task_restart() directive is called during another * rtems_task_restart() call with the same task as a nested request. */ ctx->interrupt = false; ctx->nested_request = true; break; } case RtemsTaskReqRestart_Pre_Context_NA: break; } } static void RtemsTaskReqRestart_Pre_State_Prepare( RtemsTaskReqRestart_Context *ctx, RtemsTaskReqRestart_Pre_State state ) { switch ( state ) { case RtemsTaskReqRestart_Pre_State_Ready: { /* * While the task specified by the ``id`` parameter is a ready task or * scheduled task. */ ctx->blocked = false; break; } case RtemsTaskReqRestart_Pre_State_Blocked: { /* * While the task specified by the ``id`` parameter is blocked. */ ctx->blocked = true; ctx->enqueued = false; break; } case RtemsTaskReqRestart_Pre_State_Enqueued: { /* * While the task specified by the ``id`` parameter is enqueued on a wait * queue. */ ctx->blocked = true; ctx->enqueued = true; break; } case RtemsTaskReqRestart_Pre_State_NA: break; } } static void RtemsTaskReqRestart_Pre_Timer_Prepare( RtemsTaskReqRestart_Context *ctx, RtemsTaskReqRestart_Pre_Timer state ) { switch ( state ) { case RtemsTaskReqRestart_Pre_Timer_Inactive: { /* * While timer of the task specified by the ``id`` parameter is inactive. */ ctx->timer_active = false; break; } case RtemsTaskReqRestart_Pre_Timer_Active: { /* * While timer of the task specified by the ``id`` parameter is active. */ ctx->timer_active = true; break; } case RtemsTaskReqRestart_Pre_Timer_NA: break; } } static void RtemsTaskReqRestart_Pre_RealPriority_Prepare( RtemsTaskReqRestart_Context *ctx, RtemsTaskReqRestart_Pre_RealPriority state ) { switch ( state ) { case RtemsTaskReqRestart_Pre_RealPriority_Initial: { /* * While real priority of the task specified by the ``id`` parameter is * equal to the initial priority. */ ctx->real_priority_is_initial = true; break; } case RtemsTaskReqRestart_Pre_RealPriority_Changed: { /* * While real priority of the task specified by the ``id`` parameter is * not equal to the initial priority. */ ctx->real_priority_is_initial = false; break; } case RtemsTaskReqRestart_Pre_RealPriority_NA: break; } } static void RtemsTaskReqRestart_Pre_ThreadDispatch_Prepare( RtemsTaskReqRestart_Context *ctx, RtemsTaskReqRestart_Pre_ThreadDispatch state ) { switch ( state ) { case RtemsTaskReqRestart_Pre_ThreadDispatch_Disabled: { /* * While thread dispatching is disabled for the calling task. */ ctx->dispatch_disabled = true; break; } case RtemsTaskReqRestart_Pre_ThreadDispatch_Enabled: { /* * While thread dispatching is enabled for the calling task. */ ctx->dispatch_disabled = false; break; } case RtemsTaskReqRestart_Pre_ThreadDispatch_NA: break; } } static void RtemsTaskReqRestart_Post_Status_Check( RtemsTaskReqRestart_Context *ctx, RtemsTaskReqRestart_Post_Status state ) { switch ( state ) { case RtemsTaskReqRestart_Post_Status_Ok: { /* * The return status of rtems_task_restart() shall be RTEMS_SUCCESSFUL. */ T_rsc_success( ctx->status ); break; } case RtemsTaskReqRestart_Post_Status_InvId: { /* * The return status of rtems_task_restart() shall be RTEMS_INVALID_ID. */ T_rsc( ctx->status, RTEMS_INVALID_ID ); break; } case RtemsTaskReqRestart_Post_Status_IncStat: { /* * The return status of rtems_task_restart() shall be * RTEMS_INCORRECT_STATE. */ T_rsc( ctx->status, RTEMS_INCORRECT_STATE ); break; } case RtemsTaskReqRestart_Post_Status_NoReturn: { /* * The rtems_task_restart() call shall not return. */ T_rsc( ctx->status, RTEMS_NOT_IMPLEMENTED ); break; } case RtemsTaskReqRestart_Post_Status_NA: break; } } static void RtemsTaskReqRestart_Post_FatalError_Check( RtemsTaskReqRestart_Context *ctx, RtemsTaskReqRestart_Post_FatalError state ) { switch ( state ) { case RtemsTaskReqRestart_Post_FatalError_Yes: { /* * The fatal error with a fatal source of INTERNAL_ERROR_CORE and a fatal * code of INTERNAL_ERROR_BAD_THREAD_DISPATCH_DISABLE_LEVEL shall occur * through the rtems_task_restart() call. */ T_eq_u32( ctx->calls.fatal, 1 ); break; } case RtemsTaskReqRestart_Post_FatalError_Nop: { /* * No fatal error shall occur through the rtems_task_restart() call. */ T_eq_u32( ctx->calls.fatal, 0 ); break; } case RtemsTaskReqRestart_Post_FatalError_NA: break; } } static void RtemsTaskReqRestart_Post_Argument_Check( RtemsTaskReqRestart_Context *ctx, RtemsTaskReqRestart_Post_Argument state ) { switch ( state ) { case RtemsTaskReqRestart_Post_Argument_Set: { /* * The entry point argument of the task specified by the ``id`` parameter * shall be set to the value specified by the ``argument`` parameter * before the task is unblocked by the rtems_task_restart() call. */ if ( ctx->restart_counter != 0 ) { #if CPU_SIZEOF_POINTER > 4 T_eq_u64( ctx->actual_argument, RESTART_ARGUMENT ); #else T_eq_u32( ctx->actual_argument, RESTART_ARGUMENT ); #endif T_eq_u32( ctx->restart_counter, 1 ); } else { #if CPU_SIZEOF_POINTER > 4 T_eq_u64( ctx->worker_tcb->Start.Entry.Kinds.Numeric.argument, RESTART_ARGUMENT ); T_eq_u64( ctx->actual_argument, UNSET_ARGUMENT ); #else T_eq_u32( ctx->worker_tcb->Start.Entry.Kinds.Numeric.argument, RESTART_ARGUMENT ); T_eq_u32( ctx->actual_argument, UNSET_ARGUMENT ); #endif } break; } case RtemsTaskReqRestart_Post_Argument_Nop: { /* * No entry point argument of a task shall be modified by the * rtems_task_restart() call. */ T_eq_u32( ctx->actual_argument, UNSET_ARGUMENT ); T_eq_u32( ctx->restart_counter, 0 ); break; } case RtemsTaskReqRestart_Post_Argument_NA: break; } } static void RtemsTaskReqRestart_Post_State_Check( RtemsTaskReqRestart_Context *ctx, RtemsTaskReqRestart_Post_State state ) { const T_scheduler_event *event; size_t index; index = 0; switch ( state ) { case RtemsTaskReqRestart_Post_State_Dormant: { /* * The state of the task specified by the ``id`` parameter shall be * dormant after the rtems_task_restart() call. */ T_eq_u32( ctx->worker_state, STATES_DORMANT ) event = T_scheduler_next_any( &ctx->scheduler_log.header, &index ); T_eq_int( event->operation, T_SCHEDULER_NOP ); break; } case RtemsTaskReqRestart_Post_State_DormantSuspended: { /* * The state of the task specified by the ``id`` parameter shall be * dormant and suspended after the rtems_task_restart() call. */ T_eq_u32( ctx->worker_state, STATES_DORMANT | STATES_SUSPENDED ) event = T_scheduler_next_any( &ctx->scheduler_log.header, &index ); T_eq_int( event->operation, T_SCHEDULER_NOP ); break; } case RtemsTaskReqRestart_Post_State_Blocked: { /* * The state of the task specified by the ``id`` parameter shall be * blocked after the rtems_task_restart() call. */ T_ne_u32( ctx->worker_state & STATES_BLOCKED, 0 ) T_eq_u32( ctx->worker_state & STATES_BLOCKED, ctx->worker_state ) if ( ctx->suspended && !ctx->blocked ) { event = T_scheduler_next_any( &ctx->scheduler_log.header, &index ); T_eq_int( event->operation, T_SCHEDULER_UNBLOCK ); T_eq_ptr( event->thread, ctx->worker_tcb ); } if ( !ctx->real_priority_is_initial && !ctx->terminating ) { event = T_scheduler_next_any( &ctx->scheduler_log.header, &index ); T_eq_int( event->operation, T_SCHEDULER_UPDATE_PRIORITY ); T_eq_ptr( event->thread, ctx->worker_tcb ); } event = T_scheduler_next_any( &ctx->scheduler_log.header, &index ); T_eq_int( event->operation, T_SCHEDULER_NOP ); break; } case RtemsTaskReqRestart_Post_State_Ready: { /* * The state of the task specified by the ``id`` parameter shall be ready * after the rtems_task_restart() call. */ T_eq_u32( ctx->worker_state, STATES_READY ) if ( ctx->protected ) { if ( ctx->suspended ) { event = T_scheduler_next_any( &ctx->scheduler_log.header, &index ); T_eq_int( event->operation, T_SCHEDULER_UNBLOCK ); T_eq_ptr( event->thread, ctx->worker_tcb ); } } else { if ( ctx->suspended || ctx->blocked ) { event = T_scheduler_next_any( &ctx->scheduler_log.header, &index ); T_eq_int( event->operation, T_SCHEDULER_UNBLOCK ); T_eq_ptr( event->thread, ctx->worker_tcb ); } else { event = T_scheduler_next_any( &ctx->scheduler_log.header, &index ); T_eq_int( event->operation, T_SCHEDULER_BLOCK ); T_eq_ptr( event->thread, ctx->worker_tcb ); event = T_scheduler_next_any( &ctx->scheduler_log.header, &index ); T_eq_int( event->operation, T_SCHEDULER_UNBLOCK ); T_eq_ptr( event->thread, ctx->worker_tcb ); } } if ( !ctx->real_priority_is_initial && !ctx->terminating ) { event = T_scheduler_next_any( &ctx->scheduler_log.header, &index ); T_eq_int( event->operation, T_SCHEDULER_UPDATE_PRIORITY ); T_eq_ptr( event->thread, ctx->worker_tcb ); } event = T_scheduler_next_any( &ctx->scheduler_log.header, &index ); T_eq_int( event->operation, T_SCHEDULER_NOP ); break; } case RtemsTaskReqRestart_Post_State_Zombie: { /* * The state of the task specified by the ``id`` parameter shall be the * zombie state after the rtems_task_restart() call. */ T_eq_u32( ctx->worker_state, STATES_ZOMBIE ) if ( ctx->protected ) { if ( ctx->suspended ) { event = T_scheduler_next_any( &ctx->scheduler_log.header, &index ); T_eq_int( event->operation, T_SCHEDULER_UNBLOCK ); T_eq_ptr( event->thread, ctx->worker_tcb ); } } else { if ( ctx->suspended ) { event = T_scheduler_next_any( &ctx->scheduler_log.header, &index ); T_eq_int( event->operation, T_SCHEDULER_UNBLOCK ); T_eq_ptr( event->thread, ctx->worker_tcb ); } else { event = T_scheduler_next_any( &ctx->scheduler_log.header, &index ); T_eq_int( event->operation, T_SCHEDULER_BLOCK ); T_eq_ptr( event->thread, ctx->worker_tcb ); event = T_scheduler_next_any( &ctx->scheduler_log.header, &index ); T_eq_int( event->operation, T_SCHEDULER_UNBLOCK ); T_eq_ptr( event->thread, ctx->worker_tcb ); } } if ( !ctx->real_priority_is_initial && !ctx->terminating ) { event = T_scheduler_next_any( &ctx->scheduler_log.header, &index ); T_eq_int( event->operation, T_SCHEDULER_UPDATE_PRIORITY ); T_eq_ptr( event->thread, ctx->worker_tcb ); } /* Set zombie state */ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index ); T_eq_int( event->operation, T_SCHEDULER_BLOCK ); T_eq_ptr( event->thread, ctx->worker_tcb ); /* Wake up deleter */ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index ); T_eq_int( event->operation, T_SCHEDULER_UNBLOCK ); T_eq_ptr( event->thread, ctx->deleter_tcb ); event = T_scheduler_next_any( &ctx->scheduler_log.header, &index ); T_eq_int( event->operation, T_SCHEDULER_NOP ); break; } case RtemsTaskReqRestart_Post_State_Nop: { /* * The state of the task specified by the ``id`` parameter shall not be * modified by the rtems_task_restart() call. */ T_ne_u32( ctx->worker_state & STATES_LIFE_IS_CHANGING, 0 ) if ( !ctx->real_priority_is_initial ) { event = T_scheduler_next_any( &ctx->scheduler_log.header, &index ); T_eq_int( event->operation, T_SCHEDULER_UPDATE_PRIORITY ); T_eq_ptr( event->thread, ctx->worker_tcb ); } event = T_scheduler_next_any( &ctx->scheduler_log.header, &index ); T_eq_int( event->operation, T_SCHEDULER_NOP ); break; } case RtemsTaskReqRestart_Post_State_NA: break; } } static void RtemsTaskReqRestart_Post_Enqueued_Check( RtemsTaskReqRestart_Context *ctx, RtemsTaskReqRestart_Post_Enqueued state ) { switch ( state ) { case RtemsTaskReqRestart_Post_Enqueued_Yes: { /* * The task specified by the ``id`` parameter shall be enqueued on a wait * queue after the rtems_task_restart() call. */ T_not_null( ctx->worker_tcb->Wait.queue ); break; } case RtemsTaskReqRestart_Post_Enqueued_No: { /* * The task specified by the ``id`` parameter shall not be enqueued on a * wait queue after the rtems_task_restart() call. */ T_null( ctx->worker_tcb->Wait.queue ); break; } case RtemsTaskReqRestart_Post_Enqueued_NA: break; } } static void RtemsTaskReqRestart_Post_Timer_Check( RtemsTaskReqRestart_Context *ctx, RtemsTaskReqRestart_Post_Timer state ) { TaskTimerInfo info; switch ( state ) { case RtemsTaskReqRestart_Post_Timer_Active: { /* * The timer of the task specified by the ``id`` parameter shall be * active after the rtems_task_restart() call. */ GetTaskTimerInfoByThread( ctx->worker_tcb, &info); T_eq_int( info.state, TASK_TIMER_TICKS ); break; } case RtemsTaskReqRestart_Post_Timer_Inactive: { /* * The timer of the task specified by the ``id`` parameter shall be * inactive after the rtems_task_restart() call. */ GetTaskTimerInfoByThread( ctx->worker_tcb, &info); T_eq_int( info.state, TASK_TIMER_INACTIVE ); break; } case RtemsTaskReqRestart_Post_Timer_NA: break; } } static void RtemsTaskReqRestart_Post_Restarting_Check( RtemsTaskReqRestart_Context *ctx, RtemsTaskReqRestart_Post_Restarting state ) { switch ( state ) { case RtemsTaskReqRestart_Post_Restarting_Yes: { /* * The task specified by the ``id`` parameter shall be restarting after * the rtems_task_restart() call. */ T_ne_int( ctx->worker_life_state & THREAD_LIFE_RESTARTING, 0 ); break; } case RtemsTaskReqRestart_Post_Restarting_No: { /* * The task specified by the ``id`` parameter shall not be restarting * after the rtems_task_restart() call. */ T_eq_int( ctx->worker_life_state & THREAD_LIFE_RESTARTING, 0 ); break; } case RtemsTaskReqRestart_Post_Restarting_NA: break; } } static void RtemsTaskReqRestart_Post_Terminating_Check( RtemsTaskReqRestart_Context *ctx, RtemsTaskReqRestart_Post_Terminating state ) { switch ( state ) { case RtemsTaskReqRestart_Post_Terminating_Yes: { /* * The task specified by the ``id`` parameter shall be terminating after * the rtems_task_restart() call. */ T_ne_int( ctx->worker_life_state & THREAD_LIFE_TERMINATING, 0 ); break; } case RtemsTaskReqRestart_Post_Terminating_No: { /* * The task specified by the ``id`` parameter shall not be terminating * after the rtems_task_restart() call. */ T_eq_int( ctx->worker_life_state & THREAD_LIFE_TERMINATING, 0 ); break; } case RtemsTaskReqRestart_Post_Terminating_NA: break; } } static void RtemsTaskReqRestart_Post_Protected_Check( RtemsTaskReqRestart_Context *ctx, RtemsTaskReqRestart_Post_Protected state ) { switch ( state ) { case RtemsTaskReqRestart_Post_Protected_Yes: { /* * The thread life of the task specified by the ``id`` parameter be * protected after the rtems_task_restart() call. */ T_ne_int( ctx->worker_life_state & THREAD_LIFE_PROTECTED, 0 ); break; } case RtemsTaskReqRestart_Post_Protected_No: { /* * The thread life of the task specified by the ``id`` parameter shall * not be protected after the rtems_task_restart() call. */ T_eq_int( ctx->worker_life_state & THREAD_LIFE_PROTECTED, 0 ); break; } case RtemsTaskReqRestart_Post_Protected_NA: break; } } static void RtemsTaskReqRestart_Post_RestartExtensions_Check( RtemsTaskReqRestart_Context *ctx, RtemsTaskReqRestart_Post_RestartExtensions state ) { switch ( state ) { case RtemsTaskReqRestart_Post_RestartExtensions_Yes: { /* * The thread restart user extensions shall be invoked by the * rtems_task_restart() call. */ T_eq_u32( ctx->calls_after_restart.thread_restart, 1 ); break; } case RtemsTaskReqRestart_Post_RestartExtensions_Nop: { /* * The thread restart user extensions shall not be invoked by the * rtems_task_restart() call. */ T_eq_u32( ctx->calls_after_restart.thread_restart, 0 ); break; } case RtemsTaskReqRestart_Post_RestartExtensions_NA: break; } } static void RtemsTaskReqRestart_Post_TerminateExtensions_Check( RtemsTaskReqRestart_Context *ctx, RtemsTaskReqRestart_Post_TerminateExtensions state ) { switch ( state ) { case RtemsTaskReqRestart_Post_TerminateExtensions_Yes: { /* * The thread terminate user extensions shall be invoked by the * rtems_task_restart() call. */ T_eq_u32( ctx->calls_after_restart.thread_terminate, 1 ); break; } case RtemsTaskReqRestart_Post_TerminateExtensions_Nop: { /* * The thread terminate user extensions shall not be invoked by the * rtems_task_restart() call. */ T_eq_u32( ctx->calls_after_restart.thread_terminate, 0 ); break; } case RtemsTaskReqRestart_Post_TerminateExtensions_NA: break; } } static void RtemsTaskReqRestart_Setup( RtemsTaskReqRestart_Context *ctx ) { rtems_status_code sc; ctx->runner_id = rtems_task_self(); ctx->scheduler_id = GetSelfScheduler(); ctx->mutex_id = CreateMutexNoProtocol(); ObtainMutex( ctx->mutex_id ); WrapThreadQueueInitialize( &ctx->wrap_tq_ctx, Restart, ctx ); sc = rtems_extension_create( rtems_build_name( 'T', 'E', 'S', 'T' ), &extensions, &ctx->extension_id ); T_rsc_success( sc ); SetFatalHandler( Fatal, ctx ); SetSelfPriority( PRIO_NORMAL ); ctx->deleter_id = CreateTask( "DELE", PRIO_HIGH ); ctx->deleter_tcb = GetThread( ctx->deleter_id ); StartTask( ctx->deleter_id, Deleter, NULL ); } static void RtemsTaskReqRestart_Setup_Wrap( void *arg ) { RtemsTaskReqRestart_Context *ctx; ctx = arg; ctx->Map.in_action_loop = false; RtemsTaskReqRestart_Setup( ctx ); } static void RtemsTaskReqRestart_Teardown( RtemsTaskReqRestart_Context *ctx ) { rtems_status_code sc; sc = rtems_extension_delete( ctx->extension_id ); T_rsc_success( sc ); SetFatalHandler( NULL, NULL ); DeleteTask( ctx->deleter_id ); ReleaseMutex( ctx->mutex_id ); DeleteMutex( ctx->mutex_id ); RestoreRunnerASR(); RestoreRunnerPriority(); WrapThreadQueueDestroy( &ctx->wrap_tq_ctx ); } static void RtemsTaskReqRestart_Teardown_Wrap( void *arg ) { RtemsTaskReqRestart_Context *ctx; ctx = arg; ctx->Map.in_action_loop = false; RtemsTaskReqRestart_Teardown( ctx ); } static void RtemsTaskReqRestart_Prepare( RtemsTaskReqRestart_Context *ctx ) { ctx->status = RTEMS_NOT_IMPLEMENTED; ctx->actual_argument = UNSET_ARGUMENT; ctx->restart_counter = 0; ctx->delete_worker_expected = false; ctx->worker_id = CreateTask( "WORK", PRIO_NORMAL ); ctx->delete_worker_expected = true; ctx->worker_tcb = GetThread( ctx->worker_id ); ctx->worker_state = UINT32_MAX; ctx->worker_life_state = INT_MAX; SetPriority( ctx->deleter_id, PRIO_HIGH ); } static void RtemsTaskReqRestart_Action( RtemsTaskReqRestart_Context *ctx ) { rtems_status_code sc; if ( ctx->id != INVALID_ID ) { if ( ctx->dormant ) { PrepareRealPriority( ctx ); } else { StartTask( ctx->worker_id, Worker, NULL ); /* Let the worker catch signals and set the thread life protection state */ Yield(); sc = rtems_signal_send( ctx->worker_id, RTEMS_SIGNAL_0 ); T_rsc_success( sc ); if ( ctx->restarting && ( !ctx->nested_request || ( ctx->nested_request && ctx->terminating ) ) ) { sc = rtems_task_restart( ctx->worker_id, (rtems_task_argument) ctx ); T_rsc_success( sc ); } if ( ctx->terminating && !ctx->nested_request ) { sc = rtems_task_restart( ctx->deleter_id, (rtems_task_argument) ctx ); T_rsc_success( sc ); } else { PrepareRealPriority( ctx ); Yield(); } } } if ( ctx->id == RTEMS_SELF ) { CaptureWorkerState( ctx ); } else { if ( ctx->nested_request ) { if ( ctx->terminating ) { sc = rtems_task_restart( ctx->deleter_id, (rtems_task_argument) ctx ); T_rsc_success( sc ); } else { WrapThreadQueueExtract( &ctx->wrap_tq_ctx, ctx->worker_tcb ); sc = rtems_task_restart( ctx->worker_id, (rtems_task_argument) ctx ); T_rsc_success( sc ); } } else { SetSelfPriority( PRIO_VERY_HIGH ); if ( ctx->interrupt ) { CallWithinISR( Restart, ctx ); } else { Restart( ctx ); } } } } static void RtemsTaskReqRestart_Cleanup( RtemsTaskReqRestart_Context *ctx ) { SetSelfPriority( PRIO_VERY_LOW ); if ( ctx->protected && ctx->blocked ) { if ( ctx->enqueued ) { ReleaseMutex( ctx->mutex_id ); ObtainMutex( ctx->mutex_id ); } else { SendEvents( ctx->worker_id, RTEMS_EVENT_0 ); } } if ( ctx->id == INVALID_ID || ctx->dormant || !ctx->terminating ) { DeleteTask( ctx->worker_id ); } SetSelfPriority( PRIO_NORMAL ); } static const RtemsTaskReqRestart_Entry RtemsTaskReqRestart_Entries[] = { { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NA, RtemsTaskReqRestart_Post_FatalError_NA, RtemsTaskReqRestart_Post_Argument_NA, RtemsTaskReqRestart_Post_State_NA, RtemsTaskReqRestart_Post_Enqueued_NA, RtemsTaskReqRestart_Post_Timer_NA, RtemsTaskReqRestart_Post_Restarting_NA, RtemsTaskReqRestart_Post_Terminating_NA, RtemsTaskReqRestart_Post_Protected_NA, RtemsTaskReqRestart_Post_RestartExtensions_NA, RtemsTaskReqRestart_Post_TerminateExtensions_NA }, { 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, RtemsTaskReqRestart_Post_Status_InvId, RtemsTaskReqRestart_Post_FatalError_Nop, RtemsTaskReqRestart_Post_Argument_NA, RtemsTaskReqRestart_Post_State_NA, RtemsTaskReqRestart_Post_Enqueued_NA, RtemsTaskReqRestart_Post_Timer_NA, RtemsTaskReqRestart_Post_Restarting_NA, RtemsTaskReqRestart_Post_Terminating_NA, RtemsTaskReqRestart_Post_Protected_NA, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_Nop }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NA, RtemsTaskReqRestart_Post_FatalError_NA, RtemsTaskReqRestart_Post_Argument_NA, RtemsTaskReqRestart_Post_State_NA, RtemsTaskReqRestart_Post_Enqueued_NA, RtemsTaskReqRestart_Post_Timer_NA, RtemsTaskReqRestart_Post_Restarting_NA, RtemsTaskReqRestart_Post_Terminating_NA, RtemsTaskReqRestart_Post_Protected_NA, RtemsTaskReqRestart_Post_RestartExtensions_NA, RtemsTaskReqRestart_Post_TerminateExtensions_NA }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NA, RtemsTaskReqRestart_Post_FatalError_NA, RtemsTaskReqRestart_Post_Argument_NA, RtemsTaskReqRestart_Post_State_NA, RtemsTaskReqRestart_Post_Enqueued_NA, RtemsTaskReqRestart_Post_Timer_NA, RtemsTaskReqRestart_Post_Restarting_NA, RtemsTaskReqRestart_Post_Terminating_NA, RtemsTaskReqRestart_Post_Protected_NA, RtemsTaskReqRestart_Post_RestartExtensions_NA, RtemsTaskReqRestart_Post_TerminateExtensions_NA }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NA, RtemsTaskReqRestart_Post_FatalError_NA, RtemsTaskReqRestart_Post_Argument_NA, RtemsTaskReqRestart_Post_State_NA, RtemsTaskReqRestart_Post_Enqueued_NA, RtemsTaskReqRestart_Post_Timer_NA, RtemsTaskReqRestart_Post_Restarting_NA, RtemsTaskReqRestart_Post_Terminating_NA, RtemsTaskReqRestart_Post_Protected_NA, RtemsTaskReqRestart_Post_RestartExtensions_NA, RtemsTaskReqRestart_Post_TerminateExtensions_NA }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NA, RtemsTaskReqRestart_Post_FatalError_NA, RtemsTaskReqRestart_Post_Argument_NA, RtemsTaskReqRestart_Post_State_NA, RtemsTaskReqRestart_Post_Enqueued_NA, RtemsTaskReqRestart_Post_Timer_NA, RtemsTaskReqRestart_Post_Restarting_NA, RtemsTaskReqRestart_Post_Terminating_NA, RtemsTaskReqRestart_Post_Protected_NA, RtemsTaskReqRestart_Post_RestartExtensions_NA, RtemsTaskReqRestart_Post_TerminateExtensions_NA }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NA, RtemsTaskReqRestart_Post_FatalError_NA, RtemsTaskReqRestart_Post_Argument_NA, RtemsTaskReqRestart_Post_State_NA, RtemsTaskReqRestart_Post_Enqueued_NA, RtemsTaskReqRestart_Post_Timer_NA, RtemsTaskReqRestart_Post_Restarting_NA, RtemsTaskReqRestart_Post_Terminating_NA, RtemsTaskReqRestart_Post_Protected_NA, RtemsTaskReqRestart_Post_RestartExtensions_NA, RtemsTaskReqRestart_Post_TerminateExtensions_NA }, { 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, RtemsTaskReqRestart_Post_Status_IncStat, RtemsTaskReqRestart_Post_FatalError_Nop, RtemsTaskReqRestart_Post_Argument_Nop, RtemsTaskReqRestart_Post_State_DormantSuspended, RtemsTaskReqRestart_Post_Enqueued_No, RtemsTaskReqRestart_Post_Timer_Inactive, RtemsTaskReqRestart_Post_Restarting_No, RtemsTaskReqRestart_Post_Terminating_No, RtemsTaskReqRestart_Post_Protected_No, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_Nop }, { 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, RtemsTaskReqRestart_Post_Status_IncStat, RtemsTaskReqRestart_Post_FatalError_Nop, RtemsTaskReqRestart_Post_Argument_Nop, RtemsTaskReqRestart_Post_State_Dormant, RtemsTaskReqRestart_Post_Enqueued_No, RtemsTaskReqRestart_Post_Timer_Inactive, RtemsTaskReqRestart_Post_Restarting_No, RtemsTaskReqRestart_Post_Terminating_No, RtemsTaskReqRestart_Post_Protected_No, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_Nop }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NA, RtemsTaskReqRestart_Post_FatalError_NA, RtemsTaskReqRestart_Post_Argument_NA, RtemsTaskReqRestart_Post_State_NA, RtemsTaskReqRestart_Post_Enqueued_NA, RtemsTaskReqRestart_Post_Timer_NA, RtemsTaskReqRestart_Post_Restarting_NA, RtemsTaskReqRestart_Post_Terminating_NA, RtemsTaskReqRestart_Post_Protected_NA, RtemsTaskReqRestart_Post_RestartExtensions_NA, RtemsTaskReqRestart_Post_TerminateExtensions_NA }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NA, RtemsTaskReqRestart_Post_FatalError_NA, RtemsTaskReqRestart_Post_Argument_NA, RtemsTaskReqRestart_Post_State_NA, RtemsTaskReqRestart_Post_Enqueued_NA, RtemsTaskReqRestart_Post_Timer_NA, RtemsTaskReqRestart_Post_Restarting_NA, RtemsTaskReqRestart_Post_Terminating_NA, RtemsTaskReqRestart_Post_Protected_NA, RtemsTaskReqRestart_Post_RestartExtensions_NA, RtemsTaskReqRestart_Post_TerminateExtensions_NA }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NA, RtemsTaskReqRestart_Post_FatalError_NA, RtemsTaskReqRestart_Post_Argument_NA, RtemsTaskReqRestart_Post_State_NA, RtemsTaskReqRestart_Post_Enqueued_NA, RtemsTaskReqRestart_Post_Timer_NA, RtemsTaskReqRestart_Post_Restarting_NA, RtemsTaskReqRestart_Post_Terminating_NA, RtemsTaskReqRestart_Post_Protected_NA, RtemsTaskReqRestart_Post_RestartExtensions_NA, RtemsTaskReqRestart_Post_TerminateExtensions_NA }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok, RtemsTaskReqRestart_Post_FatalError_Nop, RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_State_Ready, RtemsTaskReqRestart_Post_Enqueued_No, RtemsTaskReqRestart_Post_Timer_Inactive, RtemsTaskReqRestart_Post_Restarting_Yes, RtemsTaskReqRestart_Post_Terminating_Yes, RtemsTaskReqRestart_Post_Protected_No, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_Nop }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok, RtemsTaskReqRestart_Post_FatalError_Nop, RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_State_Ready, RtemsTaskReqRestart_Post_Enqueued_No, RtemsTaskReqRestart_Post_Timer_Inactive, RtemsTaskReqRestart_Post_Restarting_Yes, RtemsTaskReqRestart_Post_Terminating_No, RtemsTaskReqRestart_Post_Protected_No, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_Nop }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok, RtemsTaskReqRestart_Post_FatalError_Nop, RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_State_Nop, RtemsTaskReqRestart_Post_Enqueued_No, RtemsTaskReqRestart_Post_Timer_Inactive, RtemsTaskReqRestart_Post_Restarting_Yes, RtemsTaskReqRestart_Post_Terminating_No, RtemsTaskReqRestart_Post_Protected_No, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_Nop }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok, RtemsTaskReqRestart_Post_FatalError_Nop, RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_State_Nop, RtemsTaskReqRestart_Post_Enqueued_No, RtemsTaskReqRestart_Post_Timer_Inactive, RtemsTaskReqRestart_Post_Restarting_Yes, RtemsTaskReqRestart_Post_Terminating_Yes, RtemsTaskReqRestart_Post_Protected_No, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_Nop }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok, RtemsTaskReqRestart_Post_FatalError_Nop, RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_State_Ready, RtemsTaskReqRestart_Post_Enqueued_No, RtemsTaskReqRestart_Post_Timer_Inactive, RtemsTaskReqRestart_Post_Restarting_Yes, RtemsTaskReqRestart_Post_Terminating_Yes, RtemsTaskReqRestart_Post_Protected_Yes, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_Nop }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok, RtemsTaskReqRestart_Post_FatalError_Nop, RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_State_Blocked, RtemsTaskReqRestart_Post_Enqueued_No, RtemsTaskReqRestart_Post_Timer_Inactive, RtemsTaskReqRestart_Post_Restarting_Yes, RtemsTaskReqRestart_Post_Terminating_Yes, RtemsTaskReqRestart_Post_Protected_Yes, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_Nop }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok, RtemsTaskReqRestart_Post_FatalError_Nop, RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_State_Blocked, RtemsTaskReqRestart_Post_Enqueued_No, RtemsTaskReqRestart_Post_Timer_Active, RtemsTaskReqRestart_Post_Restarting_Yes, RtemsTaskReqRestart_Post_Terminating_Yes, RtemsTaskReqRestart_Post_Protected_Yes, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_Nop }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok, RtemsTaskReqRestart_Post_FatalError_Nop, RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_State_Blocked, RtemsTaskReqRestart_Post_Enqueued_Yes, RtemsTaskReqRestart_Post_Timer_Inactive, RtemsTaskReqRestart_Post_Restarting_Yes, RtemsTaskReqRestart_Post_Terminating_Yes, RtemsTaskReqRestart_Post_Protected_Yes, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_Nop }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok, RtemsTaskReqRestart_Post_FatalError_Nop, RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_State_Blocked, RtemsTaskReqRestart_Post_Enqueued_Yes, RtemsTaskReqRestart_Post_Timer_Active, RtemsTaskReqRestart_Post_Restarting_Yes, RtemsTaskReqRestart_Post_Terminating_Yes, RtemsTaskReqRestart_Post_Protected_Yes, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_Nop }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok, RtemsTaskReqRestart_Post_FatalError_Nop, RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_State_Ready, RtemsTaskReqRestart_Post_Enqueued_No, RtemsTaskReqRestart_Post_Timer_Inactive, RtemsTaskReqRestart_Post_Restarting_Yes, RtemsTaskReqRestart_Post_Terminating_No, RtemsTaskReqRestart_Post_Protected_Yes, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_Nop }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok, RtemsTaskReqRestart_Post_FatalError_Nop, RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_State_Blocked, RtemsTaskReqRestart_Post_Enqueued_No, RtemsTaskReqRestart_Post_Timer_Inactive, RtemsTaskReqRestart_Post_Restarting_Yes, RtemsTaskReqRestart_Post_Terminating_No, RtemsTaskReqRestart_Post_Protected_Yes, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_Nop }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok, RtemsTaskReqRestart_Post_FatalError_Nop, RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_State_Blocked, RtemsTaskReqRestart_Post_Enqueued_No, RtemsTaskReqRestart_Post_Timer_Active, RtemsTaskReqRestart_Post_Restarting_Yes, RtemsTaskReqRestart_Post_Terminating_No, RtemsTaskReqRestart_Post_Protected_Yes, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_Nop }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok, RtemsTaskReqRestart_Post_FatalError_Nop, RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_State_Blocked, RtemsTaskReqRestart_Post_Enqueued_Yes, RtemsTaskReqRestart_Post_Timer_Inactive, RtemsTaskReqRestart_Post_Restarting_Yes, RtemsTaskReqRestart_Post_Terminating_No, RtemsTaskReqRestart_Post_Protected_Yes, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_Nop }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok, RtemsTaskReqRestart_Post_FatalError_Nop, RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_State_Blocked, RtemsTaskReqRestart_Post_Enqueued_Yes, RtemsTaskReqRestart_Post_Timer_Active, RtemsTaskReqRestart_Post_Restarting_Yes, RtemsTaskReqRestart_Post_Terminating_No, RtemsTaskReqRestart_Post_Protected_Yes, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_Nop }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NoReturn, RtemsTaskReqRestart_Post_FatalError_Nop, RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_State_Zombie, RtemsTaskReqRestart_Post_Enqueued_No, RtemsTaskReqRestart_Post_Timer_Inactive, RtemsTaskReqRestart_Post_Restarting_Yes, RtemsTaskReqRestart_Post_Terminating_Yes, RtemsTaskReqRestart_Post_Protected_Yes, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_Yes }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NoReturn, RtemsTaskReqRestart_Post_FatalError_Nop, RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_State_Ready, RtemsTaskReqRestart_Post_Enqueued_No, RtemsTaskReqRestart_Post_Timer_Inactive, RtemsTaskReqRestart_Post_Restarting_No, RtemsTaskReqRestart_Post_Terminating_No, RtemsTaskReqRestart_Post_Protected_No, RtemsTaskReqRestart_Post_RestartExtensions_Yes, RtemsTaskReqRestart_Post_TerminateExtensions_Nop }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NoReturn, RtemsTaskReqRestart_Post_FatalError_Yes, RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_State_Ready, RtemsTaskReqRestart_Post_Enqueued_No, RtemsTaskReqRestart_Post_Timer_Inactive, RtemsTaskReqRestart_Post_Restarting_Yes, RtemsTaskReqRestart_Post_Terminating_Yes, RtemsTaskReqRestart_Post_Protected_Yes, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_Nop }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NoReturn, RtemsTaskReqRestart_Post_FatalError_Yes, RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_State_Ready, RtemsTaskReqRestart_Post_Enqueued_No, RtemsTaskReqRestart_Post_Timer_Inactive, RtemsTaskReqRestart_Post_Restarting_Yes, RtemsTaskReqRestart_Post_Terminating_Yes, RtemsTaskReqRestart_Post_Protected_No, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_Nop }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NoReturn, RtemsTaskReqRestart_Post_FatalError_Yes, RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_State_Ready, RtemsTaskReqRestart_Post_Enqueued_No, RtemsTaskReqRestart_Post_Timer_Inactive, RtemsTaskReqRestart_Post_Restarting_Yes, RtemsTaskReqRestart_Post_Terminating_No, RtemsTaskReqRestart_Post_Protected_Yes, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_Nop }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NoReturn, RtemsTaskReqRestart_Post_FatalError_Yes, RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_State_Ready, RtemsTaskReqRestart_Post_Enqueued_No, RtemsTaskReqRestart_Post_Timer_Inactive, RtemsTaskReqRestart_Post_Restarting_Yes, RtemsTaskReqRestart_Post_Terminating_No, RtemsTaskReqRestart_Post_Protected_No, RtemsTaskReqRestart_Post_RestartExtensions_Nop, RtemsTaskReqRestart_Post_TerminateExtensions_Nop } }; static const uint8_t RtemsTaskReqRestart_Map[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 28, 26, 28, 26, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 16, 0, 16, 0, 10, 0, 10, 0, 17, 0, 17, 0, 18, 0, 18, 0, 19, 0, 19, 0, 20, 0, 20, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 26, 29, 26, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 0, 12, 0, 10, 0, 10, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 30, 27, 30, 27, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 21, 0, 21, 0, 10, 0, 10, 0, 22, 0, 22, 0, 23, 0, 23, 0, 24, 0, 24, 0, 25, 0, 25, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 31, 27, 31, 27, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 0, 13, 0, 10, 0, 10, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 14, 0, 14, 0, 10, 0, 10, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 28, 26, 28, 26, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 16, 0, 16, 0, 10, 0, 10, 0, 17, 0, 17, 0, 18, 0, 18, 0, 19, 0, 19, 0, 20, 0, 20, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 26, 29, 26, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 0, 12, 0, 10, 0, 10, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 30, 27, 30, 27, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 21, 0, 21, 0, 10, 0, 10, 0, 22, 0, 22, 0, 23, 0, 23, 0, 24, 0, 24, 0, 25, 0, 25, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 31, 27, 31, 27, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 0, 13, 0, 10, 0, 10, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 28, 26, 28, 26, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 16, 0, 16, 0, 10, 0, 10, 0, 17, 0, 17, 0, 18, 0, 18, 0, 19, 0, 19, 0, 20, 0, 20, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 26, 29, 26, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 0, 12, 0, 10, 0, 10, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 30, 27, 30, 27, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 21, 0, 21, 0, 10, 0, 10, 0, 22, 0, 22, 0, 23, 0, 23, 0, 24, 0, 24, 0, 25, 0, 25, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 31, 27, 31, 27, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 0, 13, 0, 10, 0, 10, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 14, 0, 14, 0, 10, 0, 10, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 28, 26, 28, 26, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 16, 0, 16, 0, 10, 0, 10, 0, 17, 0, 17, 0, 18, 0, 18, 0, 19, 0, 19, 0, 20, 0, 20, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 26, 29, 26, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 0, 12, 0, 10, 0, 10, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 30, 27, 30, 27, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 21, 0, 21, 0, 10, 0, 10, 0, 22, 0, 22, 0, 23, 0, 23, 0, 24, 0, 24, 0, 25, 0, 25, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 31, 27, 31, 27, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 0, 13, 0, 10, 0, 10, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 16, 16, 16, 16, 10, 10, 10, 10, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 16, 0, 16, 0, 10, 0, 10, 0, 17, 0, 17, 0, 18, 0, 18, 0, 19, 0, 19, 0, 20, 0, 20, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 12, 12, 12, 12, 10, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 0, 12, 0, 10, 0, 10, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 15, 0, 15, 0, 10, 0, 10, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 21, 21, 21, 21, 10, 10, 10, 10, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 21, 0, 21, 0, 10, 0, 10, 0, 22, 0, 22, 0, 23, 0, 23, 0, 24, 0, 24, 0, 25, 0, 25, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 13, 13, 13, 13, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 0, 10, 0, 10, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 14, 0, 14, 0, 10, 0, 10, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 16, 16, 16, 16, 10, 10, 10, 10, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 16, 0, 16, 0, 10, 0, 10, 0, 17, 0, 17, 0, 18, 0, 18, 0, 19, 0, 19, 0, 20, 0, 20, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 12, 12, 12, 12, 10, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 0, 12, 0, 10, 0, 10, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 15, 0, 15, 0, 10, 0, 10, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 21, 21, 21, 21, 10, 10, 10, 10, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 21, 0, 21, 0, 10, 0, 10, 0, 22, 0, 22, 0, 23, 0, 23, 0, 24, 0, 24, 0, 25, 0, 25, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 13, 13, 13, 13, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 0, 10, 0, 10, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 16, 16, 16, 16, 10, 10, 10, 10, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 16, 0, 16, 0, 10, 0, 10, 0, 17, 0, 17, 0, 18, 0, 18, 0, 19, 0, 19, 0, 20, 0, 20, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 12, 12, 12, 12, 10, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 0, 12, 0, 10, 0, 10, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 15, 0, 15, 0, 10, 0, 10, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 21, 21, 21, 21, 10, 10, 10, 10, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 21, 0, 21, 0, 10, 0, 10, 0, 22, 0, 22, 0, 23, 0, 23, 0, 24, 0, 24, 0, 25, 0, 25, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 13, 13, 13, 13, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 0, 10, 0, 10, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 14, 0, 14, 0, 10, 0, 10, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 16, 16, 16, 16, 10, 10, 10, 10, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 16, 0, 16, 0, 10, 0, 10, 0, 17, 0, 17, 0, 18, 0, 18, 0, 19, 0, 19, 0, 20, 0, 20, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 12, 12, 12, 12, 10, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 0, 12, 0, 10, 0, 10, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 15, 0, 15, 0, 10, 0, 10, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 21, 21, 21, 21, 10, 10, 10, 10, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 21, 0, 21, 0, 10, 0, 10, 0, 22, 0, 22, 0, 23, 0, 23, 0, 24, 0, 24, 0, 25, 0, 25, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 13, 13, 13, 13, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 0, 10, 0, 10, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 }; static size_t RtemsTaskReqRestart_Scope( void *arg, char *buf, size_t n ) { RtemsTaskReqRestart_Context *ctx; ctx = arg; if ( ctx->Map.in_action_loop ) { return T_get_scope( RtemsTaskReqRestart_PreDesc, buf, n, ctx->Map.pcs ); } return 0; } static T_fixture RtemsTaskReqRestart_Fixture = { .setup = RtemsTaskReqRestart_Setup_Wrap, .stop = NULL, .teardown = RtemsTaskReqRestart_Teardown_Wrap, .scope = RtemsTaskReqRestart_Scope, .initial_context = &RtemsTaskReqRestart_Instance }; static inline RtemsTaskReqRestart_Entry RtemsTaskReqRestart_PopEntry( RtemsTaskReqRestart_Context *ctx ) { size_t index; index = ctx->Map.index; ctx->Map.index = index + 1; return RtemsTaskReqRestart_Entries[ RtemsTaskReqRestart_Map[ index ] ]; } static void RtemsTaskReqRestart_SetPreConditionStates( RtemsTaskReqRestart_Context *ctx ) { ctx->Map.pcs[ 0 ] = ctx->Map.pci[ 0 ]; if ( ctx->Map.entry.Pre_Dormant_NA ) { ctx->Map.pcs[ 1 ] = RtemsTaskReqRestart_Pre_Dormant_NA; } else { ctx->Map.pcs[ 1 ] = ctx->Map.pci[ 1 ]; } if ( ctx->Map.entry.Pre_Suspended_NA ) { ctx->Map.pcs[ 2 ] = RtemsTaskReqRestart_Pre_Suspended_NA; } else { ctx->Map.pcs[ 2 ] = ctx->Map.pci[ 2 ]; } if ( ctx->Map.entry.Pre_Restarting_NA ) { ctx->Map.pcs[ 3 ] = RtemsTaskReqRestart_Pre_Restarting_NA; } else { ctx->Map.pcs[ 3 ] = ctx->Map.pci[ 3 ]; } if ( ctx->Map.entry.Pre_Terminating_NA ) { ctx->Map.pcs[ 4 ] = RtemsTaskReqRestart_Pre_Terminating_NA; } else { ctx->Map.pcs[ 4 ] = ctx->Map.pci[ 4 ]; } if ( ctx->Map.entry.Pre_Protected_NA ) { ctx->Map.pcs[ 5 ] = RtemsTaskReqRestart_Pre_Protected_NA; } else { ctx->Map.pcs[ 5 ] = ctx->Map.pci[ 5 ]; } ctx->Map.pcs[ 6 ] = ctx->Map.pci[ 6 ]; if ( ctx->Map.entry.Pre_State_NA ) { ctx->Map.pcs[ 7 ] = RtemsTaskReqRestart_Pre_State_NA; } else { ctx->Map.pcs[ 7 ] = ctx->Map.pci[ 7 ]; } if ( ctx->Map.entry.Pre_Timer_NA ) { ctx->Map.pcs[ 8 ] = RtemsTaskReqRestart_Pre_Timer_NA; } else { ctx->Map.pcs[ 8 ] = ctx->Map.pci[ 8 ]; } if ( ctx->Map.entry.Pre_RealPriority_NA ) { ctx->Map.pcs[ 9 ] = RtemsTaskReqRestart_Pre_RealPriority_NA; } else { ctx->Map.pcs[ 9 ] = ctx->Map.pci[ 9 ]; } ctx->Map.pcs[ 10 ] = ctx->Map.pci[ 10 ]; } static void RtemsTaskReqRestart_TestVariant( RtemsTaskReqRestart_Context *ctx ) { RtemsTaskReqRestart_Pre_Id_Prepare( ctx, ctx->Map.pcs[ 0 ] ); RtemsTaskReqRestart_Pre_Dormant_Prepare( ctx, ctx->Map.pcs[ 1 ] ); RtemsTaskReqRestart_Pre_Suspended_Prepare( ctx, ctx->Map.pcs[ 2 ] ); RtemsTaskReqRestart_Pre_Restarting_Prepare( ctx, ctx->Map.pcs[ 3 ] ); RtemsTaskReqRestart_Pre_Terminating_Prepare( ctx, ctx->Map.pcs[ 4 ] ); RtemsTaskReqRestart_Pre_Protected_Prepare( ctx, ctx->Map.pcs[ 5 ] ); RtemsTaskReqRestart_Pre_Context_Prepare( ctx, ctx->Map.pcs[ 6 ] ); RtemsTaskReqRestart_Pre_State_Prepare( ctx, ctx->Map.pcs[ 7 ] ); RtemsTaskReqRestart_Pre_Timer_Prepare( ctx, ctx->Map.pcs[ 8 ] ); RtemsTaskReqRestart_Pre_RealPriority_Prepare( ctx, ctx->Map.pcs[ 9 ] ); RtemsTaskReqRestart_Pre_ThreadDispatch_Prepare( ctx, ctx->Map.pcs[ 10 ] ); RtemsTaskReqRestart_Action( ctx ); RtemsTaskReqRestart_Post_Status_Check( ctx, ctx->Map.entry.Post_Status ); RtemsTaskReqRestart_Post_FatalError_Check( ctx, ctx->Map.entry.Post_FatalError ); RtemsTaskReqRestart_Post_Argument_Check( ctx, ctx->Map.entry.Post_Argument ); RtemsTaskReqRestart_Post_State_Check( ctx, ctx->Map.entry.Post_State ); RtemsTaskReqRestart_Post_Enqueued_Check( ctx, ctx->Map.entry.Post_Enqueued ); RtemsTaskReqRestart_Post_Timer_Check( ctx, ctx->Map.entry.Post_Timer ); RtemsTaskReqRestart_Post_Restarting_Check( ctx, ctx->Map.entry.Post_Restarting ); RtemsTaskReqRestart_Post_Terminating_Check( ctx, ctx->Map.entry.Post_Terminating ); RtemsTaskReqRestart_Post_Protected_Check( ctx, ctx->Map.entry.Post_Protected ); RtemsTaskReqRestart_Post_RestartExtensions_Check( ctx, ctx->Map.entry.Post_RestartExtensions ); RtemsTaskReqRestart_Post_TerminateExtensions_Check( ctx, ctx->Map.entry.Post_TerminateExtensions ); } /** * @fn void T_case_body_RtemsTaskReqRestart( void ) */ T_TEST_CASE_FIXTURE( RtemsTaskReqRestart, &RtemsTaskReqRestart_Fixture ) { RtemsTaskReqRestart_Context *ctx; ctx = T_fixture_context(); ctx->Map.in_action_loop = true; ctx->Map.index = 0; for ( ctx->Map.pci[ 0 ] = RtemsTaskReqRestart_Pre_Id_Invalid; ctx->Map.pci[ 0 ] < RtemsTaskReqRestart_Pre_Id_NA; ++ctx->Map.pci[ 0 ] ) { for ( ctx->Map.pci[ 1 ] = RtemsTaskReqRestart_Pre_Dormant_Yes; ctx->Map.pci[ 1 ] < RtemsTaskReqRestart_Pre_Dormant_NA; ++ctx->Map.pci[ 1 ] ) { for ( ctx->Map.pci[ 2 ] = RtemsTaskReqRestart_Pre_Suspended_Yes; ctx->Map.pci[ 2 ] < RtemsTaskReqRestart_Pre_Suspended_NA; ++ctx->Map.pci[ 2 ] ) { for ( ctx->Map.pci[ 3 ] = RtemsTaskReqRestart_Pre_Restarting_Yes; ctx->Map.pci[ 3 ] < RtemsTaskReqRestart_Pre_Restarting_NA; ++ctx->Map.pci[ 3 ] ) { for ( ctx->Map.pci[ 4 ] = RtemsTaskReqRestart_Pre_Terminating_Yes; ctx->Map.pci[ 4 ] < RtemsTaskReqRestart_Pre_Terminating_NA; ++ctx->Map.pci[ 4 ] ) { for ( ctx->Map.pci[ 5 ] = RtemsTaskReqRestart_Pre_Protected_Yes; ctx->Map.pci[ 5 ] < RtemsTaskReqRestart_Pre_Protected_NA; ++ctx->Map.pci[ 5 ] ) { for ( ctx->Map.pci[ 6 ] = RtemsTaskReqRestart_Pre_Context_Task; ctx->Map.pci[ 6 ] < RtemsTaskReqRestart_Pre_Context_NA; ++ctx->Map.pci[ 6 ] ) { for ( ctx->Map.pci[ 7 ] = RtemsTaskReqRestart_Pre_State_Ready; ctx->Map.pci[ 7 ] < RtemsTaskReqRestart_Pre_State_NA; ++ctx->Map.pci[ 7 ] ) { for ( ctx->Map.pci[ 8 ] = RtemsTaskReqRestart_Pre_Timer_Inactive; ctx->Map.pci[ 8 ] < RtemsTaskReqRestart_Pre_Timer_NA; ++ctx->Map.pci[ 8 ] ) { for ( ctx->Map.pci[ 9 ] = RtemsTaskReqRestart_Pre_RealPriority_Initial; ctx->Map.pci[ 9 ] < RtemsTaskReqRestart_Pre_RealPriority_NA; ++ctx->Map.pci[ 9 ] ) { for ( ctx->Map.pci[ 10 ] = RtemsTaskReqRestart_Pre_ThreadDispatch_Disabled; ctx->Map.pci[ 10 ] < RtemsTaskReqRestart_Pre_ThreadDispatch_NA; ++ctx->Map.pci[ 10 ] ) { ctx->Map.entry = RtemsTaskReqRestart_PopEntry( ctx ); if ( ctx->Map.entry.Skip ) { continue; } RtemsTaskReqRestart_SetPreConditionStates( ctx ); RtemsTaskReqRestart_Prepare( ctx ); RtemsTaskReqRestart_TestVariant( ctx ); RtemsTaskReqRestart_Cleanup( ctx ); } } } } } } } } } } } } /** @} */