blob: 190e134be3c9c724b4f8921479428d0267975985 (
plain) (
tree)
|
|
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/wake
post-conditions:
- name: Result
states:
- name: Zero
test-code: |
/* This result is checked by Enqueue() */
text: |
The return status of ${../if/wait:/name} shall be zero.
- name: EAGAIN
test-code: |
eno = _Futex_Wait( &ctx->futex, &ctx->state, ctx->expected_value );
T_eq_int( eno, EAGAIN );
text: |
The return status of ${../if/wait:/name} shall be ${/c/if/eagain:/name}.
test-epilogue: null
test-prologue: |
int eno;
- name: Enqueue
states:
- name: 'No'
test-code: |
/* The runner would block forever */
text: |
The calling thread shall not be enqueued on the thread queue of the futex
object.
- name: 'Yes'
test-code: |
${../../tq/req/enqueue-fifo:/test-run}( &ctx->tq_ctx );
text: |
The calling thread shall be enqueued in FIFO order on the thread queue of
the futex object.
test-epilogue: null
test-prologue: null
pre-conditions:
- name: State
states:
- name: Equal
test-code: |
ctx->expected_value = 0;
text: |
While the expected futex state value is equal to the actual futex state
value.
- name: NotEqual
test-code: |
ctx->expected_value = 1;
text: |
While the expected futex state value is not equal to the actual futex
state value.
test-epilogue: null
test-prologue: null
rationale: null
references: []
requirement-type: functional
skip-reasons: {}
test-action: |
/* The action is performed in the post-conditions. */
test-brief: null
test-cleanup:
_Futex_Destroy( &ctx->futex );
test-context:
- brief: |
This member contains the thread queue test context.
description: null
member: |
TQContext tq_ctx;
- brief: |
This member specifies the expected futex state value.
description: null
member: |
int expected_value
- brief: |
This member provides the futex object.
description: null
member: |
struct _Futex_Control futex
- brief: |
This member provides the futex state.
description: null
member: |
int state
test-context-support: null
test-description: null
test-header: null
test-includes:
- sys/lock.h
- limits.h
- rtems.h
test-local-includes:
- tx-thread-queue.h
- tr-tq-enqueue-fifo.h
test-prepare: |
_Futex_Initialize( &ctx->futex );
ctx->state = 0;
test-setup:
brief: null
code: |
memset( ctx, 0, sizeof( *ctx ) );
ctx->tq_ctx.discipline = TQ_FIFO;
ctx->tq_ctx.wait = TQ_WAIT_FOREVER;
ctx->tq_ctx.enqueue_prepare = TQDoNothing;
ctx->tq_ctx.enqueue = Enqueue;
ctx->tq_ctx.enqueue_done = EnqueueDone;
ctx->tq_ctx.surrender = TQDoNothing;
ctx->tq_ctx.convert_status = TQConvertStatusPOSIX;
TQInitialize( &ctx->tq_ctx );
description: null
test-stop: null
test-support: |
typedef ${.:/test-context-type} Context;
static Context *ToContext( TQContext *tq_ctx )
{
return RTEMS_CONTAINER_OF( tq_ctx, Context, tq_ctx );
}
static Status_Control Enqueue( TQContext *tq_ctx, TQWait wait )
{
Context *ctx;
int eno;
ctx = ToContext( tq_ctx );
eno = _Futex_Wait( &ctx->futex, &ctx->state, ctx->expected_value );
T_eq_int( eno, 0 );
return STATUS_BUILD( 0, eno );
}
static void EnqueueDone( TQContext *tq_ctx )
{
Context *ctx;
int count;
ctx = ToContext( tq_ctx );
count = _Futex_Wake( &ctx->futex, INT_MAX );
T_eq_int( count, (int) ctx->tq_ctx.how_many );
}
test-target: testsuites/validation/tc-futex-wait.c
test-teardown:
brief: null
code: |
TQDestroy( &ctx->tq_ctx );
description: null
text: ${.:text-template}
transition-map:
- enabled-by: true
post-conditions:
Result: EAGAIN
Enqueue: 'No'
pre-conditions:
State:
- NotEqual
- enabled-by: true
post-conditions:
Result: Zero
Enqueue: 'Yes'
pre-conditions:
State:
- Equal
type: requirement
|