/* 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 <limits.h>
#include <rtems.h>
#include <setjmp.h>
#include <rtems/test-scheduler.h>
#include <rtems/score/statesimpl.h>
#include <rtems/score/threaddispatch.h>
#include <rtems/score/threadimpl.h>
#include "tx-support.h"
#include <rtems/test.h>
/**
* @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 );
}
}
}
}
}
}
}
}
}
}
}
}
/** @} */