SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
copyrights:
- Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
enabled-by: true
functional-type: action
links:
- role: interface-function
uid: ../if/set-priority
post-conditions:
- name: Status
states:
- name: Ok
test-code: |
T_rsc_success( ctx->status );
text: |
The return status of ${../if/set-priority:/name} shall be
${../../status/if/successful:/name}.
- name: InvAddr
test-code: |
T_rsc( ctx->status, RTEMS_INVALID_ADDRESS );
text: |
The return status of ${../if/set-priority:/name} shall be
${../../status/if/invalid-address:/name}.
- name: InvId
test-code: |
T_rsc( ctx->status, RTEMS_INVALID_ID );
text: |
The return status of ${../if/set-priority:/name} shall be
${../../status/if/invalid-id:/name}.
- name: InvPrio
test-code: |
T_rsc( ctx->status, RTEMS_INVALID_PRIORITY );
text: |
The return status of ${../if/set-priority:/name} shall be
${../../status/if/invalid-priority:/name}.
- name: NotDef
test-code: |
T_rsc( ctx->status, RTEMS_NOT_DEFINED );
text: |
The return status of ${../if/set-priority:/name} shall be
${../../status/if/not-defined:/name}.
test-epilogue: null
test-prologue: null
- name: OwnerPrio
states:
- name: Nop
test-code: |
T_eq_u32( GetSelfPriority(), PRIO_HIGH );
ReleaseSemaphore( ctx );
text: |
The current priority of the owner task of the semaphore for the scheduler
specified by the ${../if/set-priority:/params[1]/name} parameter shall
not be modified by the ${../if/set-priority:/name} call.
- name: New
test-code: |
T_eq_u32( GetSelfPriority(), PRIO_VERY_HIGH );
ReleaseSemaphore( ctx );
text: |
The current priority of the owner task of the semaphore for the scheduler
specified by the ${../if/set-priority:/params[1]/name} parameter shall be
less than or equal to the value of the
${../if/set-priority:/params[2]/name} parameter.
test-epilogue: null
test-prologue: null
- name: SemPrio
states:
- name: Set
test-code: |
if ( ( ctx->attribute_set & RTEMS_MULTIPROCESSOR_RESOURCE_SHARING ) != 0 ) {
if ( ctx->scheduler_id == ctx->other_scheduler_id ) {
CheckPriority( ctx, ctx->runner_scheduler_id, PRIO_HIGH );
CheckPriority( ctx, ctx->other_scheduler_id, PRIO_VERY_HIGH );
} else {
CheckPriority( ctx, ctx->runner_scheduler_id, PRIO_VERY_HIGH );
CheckPriority( ctx, ctx->other_scheduler_id, 0 );
}
} else if ( ( ctx->attribute_set & RTEMS_PRIORITY_CEILING ) != 0 ) {
CheckPriority( ctx, ctx->runner_scheduler_id, PRIO_VERY_HIGH );
CheckNotDefined( ctx, ctx->other_scheduler_id );
}
text: |
The priority used for the scheduler specified by the
${../if/set-priority:/params[1]/name} parameter of the semaphore
associated with the identifier specified by the
${../if/set-priority:/params[0]/name} parameter shall be set to the
prioriy specified by the ${../if/set-priority:/params[2]/name} parameter
during the ${../if/set-priority:/name} call.
- name: Nop
test-code: |
if ( ( ctx->attribute_set & RTEMS_MULTIPROCESSOR_RESOURCE_SHARING ) != 0 ) {
CheckPriority( ctx, ctx->runner_scheduler_id, PRIO_HIGH );
CheckPriority( ctx, ctx->other_scheduler_id, 0 );
} else if ( ( ctx->attribute_set & RTEMS_PRIORITY_CEILING ) != 0 ) {
CheckPriority( ctx, ctx->runner_scheduler_id, PRIO_HIGH );
CheckNotDefined( ctx, ctx->other_scheduler_id );
}
text: |
Priorities used by semaphores shall not be modified by the
${../if/set-priority:/name} call.
test-epilogue: null
test-prologue: null
- name: OldPrioVar
states:
- name: Set
test-code: |
T_eq_ptr( ctx->old_priority, &ctx->old_priority_value );
if ( ctx->scheduler_id == ctx->other_scheduler_id ) {
T_eq_u32( ctx->old_priority_value, 0 );
} else {
T_eq_u32( ctx->old_priority_value, PRIO_HIGH );
}
text: |
The value of the object referenced by the
${../if/set-priority:/params[3]/name} parameter shall be set to the
priority used for the scheduler specified by the
${../if/set-priority:/params[1]/name} parameter of the semaphore
associated with the identifier specified by the
${../if/set-priority:/params[0]/name} parameter right before the priority
is set by the ${../if/set-priority:/name} call.
- name: Nop
test-code: |
T_eq_u32( ctx->old_priority_value, INVALID_PRIO );
text: |
Objects referenced by the ${../if/set-priority:/params[3]/name} parameter in
past calls to ${../if/set-priority:/name} shall not be accessed by the
${../if/set-priority:/name} call.
test-epilogue: null
test-prologue: null
pre-conditions:
- name: Class
states:
- name: Counting
test-code: |
ctx->attribute_set |= RTEMS_COUNTING_SEMAPHORE;
text: |
While the semaphore object is a counting semaphore.
- name: Simple
test-code: |
ctx->attribute_set |= RTEMS_SIMPLE_BINARY_SEMAPHORE;
text: |
While the semaphore object is a simple binary semaphore.
- name: Binary
test-code: |
ctx->attribute_set |= RTEMS_BINARY_SEMAPHORE;
text: |
While the semaphore object is a binary semaphore.
- name: PrioCeilingNoOwner
test-code: |
ctx->attribute_set |= RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY_CEILING;
text: |
While the semaphore object is a priority ceiling semaphore, while the
semaphore has no owner.
- name: PrioCeilingOwner
test-code: |
ctx->attribute_set |= RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY_CEILING;
ctx->count = 0;
text: |
While the semaphore object is a priority ceiling semaphore, while the
semaphore has an owner.
- name: PrioInherit
test-code: |
ctx->attribute_set |= RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY;
text: |
While the semaphore object is a priority inheritance semaphore.
- name: MrsP
test-code: |
ctx->attribute_set |= RTEMS_BINARY_SEMAPHORE |
RTEMS_MULTIPROCESSOR_RESOURCE_SHARING;
text: |
While the semaphore object is a MrsP semaphore.
test-epilogue: null
test-prologue: null
- name: SemId
states:
- name: Valid
test-code: |
ctx->valid_id = true;
text: |
While the ${../if/set-priority:/params[0]/name} parameter is associated
with the semaphore.
- name: Invalid
test-code: |
ctx->valid_id = false;
text: |
While the ${../if/set-priority:/params[0]/name} parameter is not
associated with a semaphore.
test-epilogue: null
test-prologue: null
- name: SchedId
states:
- name: Invalid
test-code: |
ctx->scheduler_id = INVALID_ID;
text: |
While the ${../if/set-priority:/params[1]/name} parameter is not associated
with a scheduler.
- name: Create
test-code: |
ctx->scheduler_id = ctx->runner_scheduler_id;
text: |
text: |
While the ${../if/set-priority:/params[1]/name} parameter is associated with
the scheduler used to create the semaphore.
- name: Other
test-code: |
ctx->scheduler_id = ctx->other_scheduler_id;
text: |
text: |
While the ${../if/set-priority:/params[1]/name} parameter is associated
with a scheduler other than the one used to create the semaphore.
test-epilogue: null
test-prologue: null
- name: NewPrio
states:
- name: Current
test-code: |
ctx->new_priority = RTEMS_CURRENT_PRIORITY;
text: |
While the ${../if/set-priority:/params[2]/name} parameter is equal to
${../../task/if/current-priority:/name}.
- name: Valid
test-code: |
ctx->new_priority = PRIO_VERY_HIGH;
text: |
While the ${../if/set-priority:/params[2]/name} parameter is not equal to
${../../task/if/current-priority:/name} and valid with respect to the
scheduler specified by the ${../if/set-priority:/params[1]/name}
parameter.
- name: Invalid
test-code: |
ctx->new_priority = INVALID_PRIO;
text: |
While the ${../if/set-priority:/params[2]/name} parameter is invalid with
respect to the scheduler specified by the
${../if/set-priority:/params[1]/name} parameter.
test-epilogue: null
test-prologue: null
- name: OldPrio
states:
- name: Valid
test-code: |
ctx->old_priority = &ctx->old_priority_value;
text: |
While the ${../if/set-priority:/params[3]/name} parameter references an
object of type ${../../type/if/priority:/name}.
- name: 'Null'
test-code: |
ctx->old_priority = NULL;
text: |
While the ${../if/set-priority:/params[3]/name} parameter is
${/c/if/null:/name}.
test-epilogue: null
test-prologue: null
rationale: null
references: []
requirement-type: functional
skip-reasons:
NoOtherScheduler: |
Where the system was built with SMP support disabled, exactly one scheduler
is present in an application.
test-action: |
rtems_status_code sc;
sc = rtems_semaphore_create(
NAME,
ctx->count,
ctx->attribute_set,
PRIO_HIGH,
&ctx->the_semaphore_id
);
T_rsc_success( sc );
if ( ctx->valid_id ) {
ctx->semaphore_id = ctx->the_semaphore_id;
} else {
ctx->semaphore_id = INVALID_ID;
}
ctx->status = rtems_semaphore_set_priority(
ctx->semaphore_id,
ctx->scheduler_id,
ctx->new_priority,
ctx->old_priority
);
test-brief: null
test-cleanup: |
rtems_status_code sc;
T_eq_u32( GetSelfPriority(), PRIO_NORMAL );
sc = rtems_semaphore_delete( ctx->the_semaphore_id );
T_rsc_success( sc );
test-context:
- brief: |
This member contains the scheduler identifier of the runner task.
description: null
member: |
rtems_id runner_scheduler_id
- brief: |
This member contains the scheduler identifier of a scheduler not used by
the runner task.
description: null
member: |
rtems_id other_scheduler_id
- brief: |
This member specifies the initial count of the semaphore.
description: null
member: |
uint32_t count
- brief: |
This member specifies the attribute set of the semaphore.
description: null
member: |
rtems_attribute attribute_set
- brief: |
This member contains the semaphore identifier.
description: null
member: |
rtems_id the_semaphore_id
- brief: |
If this member is true, then the ${../if/set-priority:/params[0]/name}
parameter value shall be associated with the semaphore, otherwise it shall
be not associated with a semaphore.
description: null
member: |
bool valid_id
- brief: |
This member may contain the task priority returned by
${../if/set-priority:/name}.
description: null
member: |
rtems_task_priority old_priority_value
- brief: |
This member specifies the ${../if/set-priority:/params[0]/name} parameter
for the ${../if/set-priority:/name} call.
description: null
member: |
rtems_id semaphore_id
- brief: |
This member specifies the ${../if/set-priority:/params[1]/name} parameter
for the ${../if/set-priority:/name} call.
description: null
member: |
rtems_id scheduler_id
- brief: |
This member specifies the ${../if/set-priority:/params[2]/name} parameter
for the ${../if/set-priority:/name} call.
description: null
member: |
rtems_task_priority new_priority
- brief: |
This member specifies the ${../if/set-priority:/params[3]/name} parameter
for the ${../if/set-priority:/name} call.
description: null
member: |
rtems_task_priority *old_priority
- brief: |
This member contains the status of the ${../if/set-priority:/name} call.
description: null
member: |
rtems_status_code status
test-context-support: null
test-description: null
test-header: null
test-includes:
- rtems.h
- string.h
test-local-includes:
- tc-support.h
- ts-config.h
test-prepare: |
ctx->old_priority_value = INVALID_PRIO;
ctx->count = 1;
ctx->attribute_set = RTEMS_PRIORITY;
ctx->valid_id = true;
test-setup:
brief: null
code: |
rtems_status_code sc;
memset( ctx, 0, sizeof( *ctx ) );
SetSelfPriority( PRIO_NORMAL );
sc = rtems_task_get_scheduler( RTEMS_SELF, &ctx->runner_scheduler_id );
T_rsc_success( sc );
#if defined(RTEMS_SMP)
sc = rtems_scheduler_ident(
TEST_SCHEDULER_B_NAME,
&ctx->other_scheduler_id
);
T_rsc_success( sc );
#else
ctx->other_scheduler_id = INVALID_ID;
#endif
description: null
test-stop: null
test-support: |
#define NAME rtems_build_name( 'T', 'E', 'S', 'T' )
#define INVALID_ID 0xffffffff
#define INVALID_PRIO 0xffffffff
typedef RtemsSemReqSetPriority_Context Context;
static void ReleaseSemaphore( const Context *ctx )
{
rtems_status_code sc;
sc = rtems_semaphore_release( ctx->the_semaphore_id );
T_rsc_success( sc );
}
static void SetScheduler( rtems_id scheduler_id )
{
#if defined(RTEMS_SMP)
rtems_status_code sc;
sc = rtems_task_set_scheduler( RTEMS_SELF, scheduler_id, PRIO_NORMAL );
T_rsc_success( sc );
#else
(void) scheduler_id;
#endif
}
static void CheckPriority(
const Context *ctx,
rtems_id scheduler_id,
rtems_task_priority priority
)
{
rtems_status_code sc;
SetScheduler( scheduler_id );
sc = rtems_semaphore_obtain(
ctx->the_semaphore_id,
RTEMS_WAIT,
RTEMS_NO_TIMEOUT
);
T_rsc_success( sc );
T_eq_u32( GetSelfPriority(), priority );
ReleaseSemaphore( ctx );
SetScheduler( ctx->runner_scheduler_id );
}
static void CheckNotDefined(
const Context *ctx,
rtems_id scheduler_id
)
{
#if defined(RTEMS_SMP)
rtems_status_code sc;
SetScheduler( scheduler_id );
sc = rtems_semaphore_obtain(
ctx->the_semaphore_id,
RTEMS_WAIT,
RTEMS_NO_TIMEOUT
);
T_rsc( sc, RTEMS_NOT_DEFINED );
SetScheduler( ctx->runner_scheduler_id );
#else
(void) ctx;
(void) scheduler_id;
#endif
}
test-target: testsuites/validation/tc-sem-set-priority.c
test-teardown:
brief: null
code: |
RestoreRunnerPriority();
description: null
text: ${.:text-template}
transition-map:
- enabled-by: true
post-conditions:
Status: InvAddr
OwnerPrio:
- if:
pre-conditions:
Class: PrioCeilingOwner
then: Nop
- else: N/A
SemPrio: Nop
OldPrioVar: Nop
pre-conditions:
Class: all
OldPrio:
- 'Null'
SchedId:
SchedId:
- Invalid
- Create
SemId: all
NewPrio: all
- enabled-by: true
post-conditions:
Status: InvId
OwnerPrio:
- if:
pre-conditions:
Class: PrioCeilingOwner
then: Nop
- else: N/A
SemPrio: Nop
OldPrioVar: Nop
pre-conditions:
Class: all
OldPrio:
- Valid
SchedId:
- Invalid
SemId: all
NewPrio: all
- enabled-by: true
post-conditions:
Status: InvId
OwnerPrio:
- if:
pre-conditions:
Class: PrioCeilingOwner
then: Nop
- else: N/A
SemPrio: Nop
OldPrioVar: Nop
pre-conditions:
Class: all
OldPrio:
- Valid
SchedId:
- Create
SemId:
- Invalid
NewPrio: all
- enabled-by: true
post-conditions:
Status: InvPrio
OwnerPrio:
- if:
pre-conditions:
Class: PrioCeilingOwner
then: Nop
- else: N/A
SemPrio: Nop
OldPrioVar: Nop
pre-conditions:
Class:
- Counting
- Simple
- Binary
- PrioCeilingNoOwner
- PrioCeilingOwner
- PrioInherit
- MrsP
OldPrio:
- Valid
SchedId:
- Create
SemId:
- Valid
NewPrio:
- Invalid
- enabled-by: true
post-conditions:
Status: NotDef
OwnerPrio:
- if:
pre-conditions:
Class: PrioCeilingOwner
then: Nop
- else: N/A
SemPrio: Nop
OldPrioVar: Nop
pre-conditions:
Class:
- Counting
- Simple
- Binary
- PrioInherit
OldPrio:
- Valid
SchedId:
- Create
SemId:
- Valid
NewPrio:
- Current
- Valid
- enabled-by: true
post-conditions:
Status: Ok
OwnerPrio:
- if:
pre-conditions:
Class: PrioCeilingOwner
NewPrio: Valid
then: New
- if:
pre-conditions:
Class: PrioCeilingOwner
NewPrio: Current
then: Nop
- else: N/A
SemPrio:
- if:
pre-conditions:
NewPrio: Current
then: Nop
- else: Set
OldPrioVar: Set
pre-conditions:
Class:
- PrioCeilingNoOwner
- PrioCeilingOwner
- MrsP
OldPrio:
- Valid
SchedId:
- Create
SemId:
- Valid
NewPrio:
- Current
- Valid
- enabled-by: true
post-conditions: NoOtherScheduler
pre-conditions:
Class: all
OldPrio: all
SchedId:
- Other
SemId: all
NewPrio: all
- enabled-by: RTEMS_SMP
post-conditions:
Status: InvAddr
OwnerPrio:
- if:
pre-conditions:
Class: PrioCeilingOwner
then: Nop
- else: N/A
SemPrio: Nop
OldPrioVar: Nop
pre-conditions:
Class: all
OldPrio:
- 'Null'
SchedId:
- Other
SemId: all
NewPrio: all
- enabled-by: RTEMS_SMP
post-conditions:
Status: InvId
OwnerPrio:
- if:
pre-conditions:
Class: PrioCeilingOwner
then: Nop
- else: N/A
SemPrio: Nop
OldPrioVar: Nop
pre-conditions:
Class: all
OldPrio:
- Valid
SchedId:
- Other
SemId:
- Invalid
NewPrio: all
- enabled-by: RTEMS_SMP
post-conditions:
Status: InvPrio
OwnerPrio:
- if:
pre-conditions:
Class: PrioCeilingOwner
then: Nop
- else: N/A
SemPrio: Nop
OldPrioVar: Nop
pre-conditions:
Class:
- Counting
- Simple
- Binary
- PrioCeilingNoOwner
- PrioCeilingOwner
- PrioInherit
- MrsP
OldPrio:
- Valid
SchedId:
- Other
SemId:
- Valid
NewPrio:
- Invalid
- enabled-by: RTEMS_SMP
post-conditions:
Status: NotDef
OwnerPrio:
- if:
pre-conditions:
Class: PrioCeilingOwner
then: Nop
- else: N/A
SemPrio: Nop
OldPrioVar: Nop
pre-conditions:
Class:
- Counting
- Simple
- Binary
- PrioInherit
OldPrio:
- Valid
SchedId:
- Other
SemId:
- Valid
NewPrio:
- Current
- Valid
- enabled-by: RTEMS_SMP
post-conditions:
Status: NotDef
OwnerPrio:
- if:
pre-conditions:
Class: PrioCeilingOwner
then: Nop
- else: N/A
SemPrio: Nop
OldPrioVar: Nop
pre-conditions:
Class:
- PrioCeilingNoOwner
- PrioCeilingOwner
OldPrio:
- Valid
SchedId:
- Other
SemId:
- Valid
NewPrio:
- Current
- Valid
- enabled-by: RTEMS_SMP
post-conditions:
Status: Ok
OwnerPrio: N/A
SemPrio:
- if:
pre-conditions:
NewPrio: Current
then: Nop
- else: Set
OldPrioVar: Set
pre-conditions:
Class:
- MrsP
OldPrio:
- Valid
SchedId:
- Other
SemId:
- Valid
NewPrio:
- Current
- Valid
type: requirement