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/wait
post-conditions:
- name: Status
states:
- name: Ok
test-code: |
T_rsc_success( ctx->status );
text: |
The return status of ${../if/wait:/name} shall be
${../../status/if/successful:/name}.
- name: InvId
test-code: |
T_rsc( ctx->status, RTEMS_INVALID_ID );
text: |
The return status of ${../if/wait:/name} shall be
${../../status/if/invalid-id:/name}.
- name: Timeout
test-code: |
T_rsc( ctx->status, RTEMS_TIMEOUT );
text: |
The return status of ${../if/wait:/name} shall be
${../../status/if/timeout:/name}.
- name: ObjDel
test-code: |
T_rsc( ctx->status, RTEMS_OBJECT_WAS_DELETED );
text: |
The return status of ${../if/wait:/name} shall be
${../../status/if/object-was-deleted:/name}.
- name: NoReturn
test-code: |
T_rsc_success( ctx->status );
text: |
The call to ${../if/wait:/name} shall not return to the calling task.
test-epilogue: null
test-prologue: null
pre-conditions:
- name: Id
states:
- name: NoObj
test-code: |
ctx->id = 0xffffffff;
text: |
While the ${../if/release:/params[0]/name} parameter is not associated
with a barrier.
- name: Manual
test-code: |
ctx->id = ctx->manual_release_id;
text: |
While the ${../if/release:/params[0]/name} parameter is associated with a
manual release barrier.
- name: Auto
test-code: |
ctx->id = ctx->auto_release_id;
text: |
While the ${../if/release:/params[0]/name} parameter is associated with an
automatic release barrier.
test-epilogue: null
test-prologue: null
- name: Timeout
states:
- name: Ticks
test-code: |
ctx->timeout = 2;
text: |
While the ${../if/release:/params[1]/name} parameter is a clock tick
interval.
- name: Forever
test-code: |
ctx->timeout = RTEMS_NO_TIMEOUT;
text: |
While the ${../if/release:/params[1]/name} parameter is
${../../type/if/no-timeout:/name}.
test-epilogue: null
test-prologue: null
- name: Satisfy
states:
- name: Never
test-code: |
if ( ctx->timeout == RTEMS_NO_TIMEOUT ) {
SendEvents( ctx->low_worker_id, EVENT_CHECK_TIMER | EVENT_RELEASE );
}
text: |
While the calling task waits at the barrier, while the barrier is not
released or deleted.
- name: Wait
test-code: |
SendEvents( ctx->high_worker_id, EVENT_WAIT );
text: |
While calling the directive releases the barrier.
- name: Release
test-code: |
SendEvents( ctx->low_worker_id, EVENT_RELEASE );
text: |
While the calling task waits at the barrier, while the barrier is
released.
- name: Delete
test-code: |
SendEvents( ctx->low_worker_id, EVENT_DELETE );
text: |
While the calling task waits at the barrier, while the barrier is
deleted.
test-epilogue: null
test-prologue: null
rationale: null
references: []
requirement-type: functional
skip-reasons:
NoWaitRelease: |
Manual release barriers cannot be released by calling the directive.
test-action: |
ctx->status = rtems_barrier_wait( ctx->id, ctx->timeout );
test-brief: null
test-cleanup: null
test-context:
- brief: null
description: null
member: |
rtems_id main_id
- brief: null
description: null
member: |
rtems_id high_worker_id
- brief: null
description: null
member: |
rtems_id low_worker_id
- brief: null
description: null
member: |
rtems_id manual_release_id
- brief: null
description: null
member: |
rtems_id auto_release_id
- brief: null
description: null
member: |
rtems_id id
- brief: null
description: null
member: |
rtems_interval timeout
- brief: null
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
test-prepare: null
test-setup:
brief: null
code: |
rtems_status_code sc;
memset( ctx, 0, sizeof( *ctx ) );
ctx->main_id = rtems_task_self();
SetSelfPriority( PRIO_NORMAL );
ctx->high_worker_id = CreateTask( "WRKH", PRIO_HIGH );
StartTask( ctx->high_worker_id, Worker, ctx );
ctx->low_worker_id = CreateTask( "WRKL", PRIO_LOW );
StartTask( ctx->low_worker_id, Worker, ctx );
sc = rtems_barrier_create(
NAME,
RTEMS_BARRIER_MANUAL_RELEASE,
0,
&ctx->manual_release_id
);
T_assert_rsc_success( sc );
sc = rtems_barrier_create(
NAME,
RTEMS_BARRIER_AUTOMATIC_RELEASE,
2,
&ctx->auto_release_id
);
T_assert_rsc_success( sc );
description: null
test-stop: null
test-support: |
#define NAME rtems_build_name( 'T', 'E', 'S', 'T' )
#define EVENT_CHECK_TIMER RTEMS_EVENT_0
#define EVENT_WAIT RTEMS_EVENT_1
#define EVENT_RELEASE RTEMS_EVENT_2
#define EVENT_DELETE RTEMS_EVENT_3
typedef RtemsBarrierReqWait_Context Context;
static void Worker( rtems_task_argument arg )
{
Context *ctx;
ctx = (Context *) arg;
while ( true ) {
rtems_status_code sc;
rtems_event_set events;
events = ReceiveAnyEvents();
if ( ( events & EVENT_CHECK_TIMER ) != 0 ) {
T_eq_int(
T_get_thread_timer_state( ctx->main_id ),
T_THREAD_TIMER_INACTIVE
);
}
if ( ( events & EVENT_WAIT ) != 0 ) {
sc = rtems_barrier_wait( ctx->id, RTEMS_NO_TIMEOUT );
T_rsc_success( sc );
}
if ( ( events & EVENT_RELEASE ) != 0 ) {
uint32_t released;
sc = rtems_barrier_release( ctx->id, &released );
T_rsc_success( sc );
}
if ( ( events & EVENT_DELETE ) != 0 ) {
rtems_attribute attribute_set;
uint32_t maximum_waiters;
rtems_id *id;
rtems_task_priority prio;
if ( ctx->id == ctx->manual_release_id ) {
attribute_set = RTEMS_BARRIER_MANUAL_RELEASE;
maximum_waiters = 0;
id = &ctx->manual_release_id;
} else {
attribute_set = RTEMS_BARRIER_AUTOMATIC_RELEASE;
maximum_waiters = 2;
id = &ctx->auto_release_id;
}
prio = SetSelfPriority( PRIO_HIGH );
T_eq_u32( prio, PRIO_LOW );
sc = rtems_barrier_delete( ctx->id );
T_rsc_success( sc );
sc = rtems_barrier_create( NAME, attribute_set, maximum_waiters, id );
T_rsc_success( sc );
prio = SetSelfPriority( prio );
T_eq_u32( prio, PRIO_HIGH );
}
}
}
test-target: testsuites/validation/tc-barrier-wait.c
test-teardown:
brief: null
code: |
rtems_status_code sc;
DeleteTask( ctx->high_worker_id );
DeleteTask( ctx->low_worker_id );
if ( ctx->manual_release_id != 0 ) {
sc = rtems_barrier_delete( ctx->manual_release_id );
T_rsc_success( sc );
}
if ( ctx->auto_release_id != 0 ) {
sc = rtems_barrier_delete( ctx->auto_release_id );
T_rsc_success( sc );
}
RestoreRunnerPriority();
description: null
text: ${.:text-template}
transition-map:
- enabled-by: true
post-conditions:
Status: InvId
pre-conditions:
Id:
- NoObj
Timeout: N/A
Satisfy: N/A
- enabled-by: true
post-conditions:
Status: Ok
pre-conditions:
Id:
- Manual
- Auto
Timeout: all
Satisfy:
- Release
- enabled-by: true
post-conditions:
Status: Ok
pre-conditions:
Id:
- Auto
Timeout: all
Satisfy:
- Wait
- enabled-by: true
post-conditions:
Status: NoReturn
pre-conditions:
Id:
- Manual
- Auto
Timeout:
- Forever
Satisfy:
- Never
- enabled-by: true
post-conditions: NoWaitRelease
pre-conditions:
Id:
- Manual
Timeout: all
Satisfy:
- Wait
- enabled-by: true
post-conditions:
Status: Timeout
pre-conditions:
Id:
- Manual
- Auto
Timeout:
- Ticks
Satisfy:
- Never
- enabled-by: true
post-conditions:
Status: ObjDel
pre-conditions:
Id:
- Manual
- Auto
Timeout: all
Satisfy:
- Delete
type: requirement