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/delete post-conditions: - name: Status states: - name: Ok test-code: | ctx->semaphore_id = 0; T_rsc_success( ctx->delete_status ); text: | The return status of ${../if/delete:/name} shall be ${../../status/if/successful:/name}. - name: InvId test-code: | T_rsc( ctx->delete_status, RTEMS_INVALID_ID ); text: | The return status of ${../if/delete:/name} shall be ${../../status/if/invalid-id:/name}. - name: InUse test-code: | T_rsc( ctx->delete_status, RTEMS_RESOURCE_IN_USE ); text: | The return status of ${../if/delete:/name} shall be ${../../status/if/resource-in-use:/name}. test-epilogue: null test-prologue: null - name: Name states: - name: Valid test-code: | id = 0; sc = rtems_semaphore_ident( NAME, RTEMS_SEARCH_LOCAL_NODE, &id ); T_rsc_success( sc ); T_eq_u32( id, ctx->semaphore_id ); text: | The unique object name shall identify a semaphore. - name: Invalid test-code: | sc = rtems_semaphore_ident( NAME, RTEMS_SEARCH_LOCAL_NODE, &id ); T_rsc( sc, RTEMS_INVALID_NAME ); text: | The unique object name shall not identify a semaphore. test-epilogue: null test-prologue: | rtems_status_code sc; rtems_id id; - name: Flush states: - name: FIFO test-code: | T_eq_u32( ctx->worker_counter[ 0 ], 1 ); T_eq_u32( ctx->worker_counter[ 1 ], 2 ); text: | Tasks waiting at the semaphore shall be unblocked in FIFO order. - name: Priority test-code: | T_eq_u32( ctx->worker_counter[ 0 ], 2 ); T_eq_u32( ctx->worker_counter[ 1 ], 1 ); text: | Tasks waiting at the semaphore shall be unblocked in priority order. - name: 'No' test-code: | T_eq_u32( ctx->worker_counter[ 0 ], 0 ); T_eq_u32( ctx->worker_counter[ 1 ], 0 ); text: | Tasks waiting at the semaphore shall remain blocked. test-epilogue: null test-prologue: null pre-conditions: - name: Id states: - name: NoObj test-code: | ctx->valid_id = false; text: | While the ${../if/delete:/params[0]/name} parameter is not associated with a semaphore. - name: Counting test-code: | ctx->attribute_set |= RTEMS_COUNTING_SEMAPHORE; ctx->obtain_status = RTEMS_OBJECT_WAS_DELETED; text: | text: | While the ${../if/delete:/params[0]/name} parameter is associated with a counting semaphore. - name: Simple test-code: | ctx->attribute_set |= RTEMS_SIMPLE_BINARY_SEMAPHORE; ctx->obtain_status = RTEMS_OBJECT_WAS_DELETED; text: | While the ${../if/delete:/params[0]/name} parameter is associated with a simple binary semaphore. - name: Binary test-code: | ctx->attribute_set |= RTEMS_BINARY_SEMAPHORE; text: | While the ${../if/delete:/params[0]/name} parameter is associated with a binary semaphore. - name: PrioCeiling test-code: | ctx->attribute_set |= RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY_CEILING; text: | While the ${../if/delete:/params[0]/name} parameter is associated with a priority ceiling semaphore. - name: PrioInherit test-code: | ctx->attribute_set |= RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY; text: | While the ${../if/delete:/params[0]/name} parameter is associated with a priority inheritance semaphore. - name: MrsP test-code: | ctx->attribute_set |= RTEMS_BINARY_SEMAPHORE | RTEMS_MULTIPROCESSOR_RESOURCE_SHARING; text: | While the ${../if/delete:/params[0]/name} parameter is associated with a MrsP semaphore. test-epilogue: null test-prologue: null - name: Discipline states: - name: FIFO test-code: | ctx->attribute_set |= RTEMS_FIFO; text: | While the semaphore uses the FIFO task wait queue discipline. - name: Priority test-code: | ctx->attribute_set |= RTEMS_PRIORITY; text: | While the semaphore uses the priority task wait queue discipline. test-epilogue: null test-prologue: null - name: State states: - name: GtZeroOrNoOwner test-code: | ctx->blocked = false; ctx->count = 1; text: | While the semaphore has a count greater than zero or no owner. - name: Zero test-code: | ctx->blocked = false; ctx->count = 0; text: | While the semaphore has a count of zero or an owner. - name: Blocked test-code: | ctx->blocked = true; ctx->count = 0; text: | While the semaphore has tasks blocked on the semaphore. test-epilogue: null test-prologue: null rationale: null references: [] requirement-type: functional skip-reasons: NeedsPriorityDiscipline: | Binary semaphores with a locking protocol are required to use the priority task wait queue discipline. test-action: | rtems_status_code sc; sc = rtems_semaphore_create( NAME, ctx->count, ctx->attribute_set, PRIO_ULTRA_HIGH, &ctx->semaphore_id ); T_rsc_success( sc ); if ( ctx->blocked ) { WakeUp( ctx, 0 ); WakeUp( ctx, 1 ); } if ( ctx->valid_id ) { ctx->id = ctx->semaphore_id; } else { ctx->id = 0; } ctx->delete_status = rtems_semaphore_delete( ctx->id ); test-brief: null test-cleanup: | if ( ctx->semaphore_id != 0 ) { rtems_status_code sc; if ( ctx->count == 0 ) { sc = rtems_semaphore_release( ctx->semaphore_id ); T_rsc_success( sc ); } sc = rtems_semaphore_delete( ctx->semaphore_id ); T_rsc_success( sc ); ctx->semaphore_id = 0; } test-context: - brief: | This member contains the worker task identifiers. description: null member: | rtems_id worker_id[ 2 ] - brief: | This member contains the worker activity counter. description: null member: | uint32_t counter - brief: | This member contains the worker activity counter of a specific worker. description: null member: | uint32_t worker_counter[ 2 ] - brief: | This member specifies the expected ${../if/obtain:/name} status. description: null member: | rtems_status_code obtain_status - brief: | This member specifies if the initial count of the semaphore. description: null member: | uint32_t count - brief: | This member specifies if 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 semaphore_id - brief: | If this member is true, then the ${../if/create:/params[0]/name} parameter shall be valid, otherwise it should be ${/c/if/null:/name}. description: null member: | bool valid_id - brief: | If this member is true, then tasks shall be blocked on the semaphore, otherwise no tasks shall be blocked on the semaphore. description: null member: | bool blocked - brief: | This member specifies the ${../if/create:/params[0]/name} parameter for the ${../if/delete:/name} call. description: null member: | rtems_id id - brief: | This member specifies the expected ${../if/delete:/name} status. description: null member: | rtems_status_code delete_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: | ctx->counter = 0; ctx->worker_counter[ 0 ] = 0; ctx->worker_counter[ 1 ] = 0; ctx->attribute_set = RTEMS_DEFAULT_ATTRIBUTES; ctx->valid_id = true; ctx->obtain_status = RTEMS_SUCCESSFUL; test-setup: brief: null code: | memset( ctx, 0, sizeof( *ctx ) ); SetSelfPriority( PRIO_NORMAL ); ctx->worker_id[ 0 ] = CreateTask( "WRK0", PRIO_HIGH ); StartTask( ctx->worker_id[ 0 ], WorkerZero, ctx ); ctx->worker_id[ 1 ] = CreateTask( "WRK1", PRIO_VERY_HIGH ); StartTask( ctx->worker_id[ 1 ], WorkerOne, ctx ); description: null test-stop: null test-support: | #define NAME rtems_build_name( 'T', 'E', 'S', 'T' ) #define EVENT_OBTAIN RTEMS_EVENT_0 typedef RtemsSemReqDelete_Context Context; static void WakeUp( Context *ctx, size_t index ) { SendEvents( ctx->worker_id[ index ], RTEMS_EVENT_0 ); } static void Worker( rtems_task_argument arg, size_t index ) { Context *ctx; ctx = (Context *) arg; /* * In order to test the flush in FIFO order, we have to use the no-preempt * mode. */ SetMode( RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK ); while ( true ) { rtems_status_code sc; rtems_event_set events; uint32_t counter; events = ReceiveAnyEvents(); T_eq_u32( events, RTEMS_EVENT_0 ); sc = rtems_semaphore_obtain( ctx->semaphore_id, RTEMS_WAIT, RTEMS_NO_TIMEOUT ); T_rsc( sc, ctx->obtain_status ); counter = ctx->counter; ++counter; ctx->counter = counter; ctx->worker_counter[ index ] = counter; if ( sc == RTEMS_SUCCESSFUL ) { sc = rtems_semaphore_release( ctx->semaphore_id ); T_rsc_success( sc ); } } } static void WorkerZero( rtems_task_argument arg ) { Worker( arg, 0 ); } static void WorkerOne( rtems_task_argument arg ) { Worker( arg, 1 ); } test-target: testsuites/validation/tc-sem-delete.c test-teardown: brief: null code: | size_t i; for ( i = 0; i < RTEMS_ARRAY_SIZE( ctx->worker_id ); ++i ) { DeleteTask( ctx->worker_id[ i ] ); } RestoreRunnerPriority(); description: null text: ${.:text-template} transition-map: - enabled-by: true post-conditions: Status: InvId Name: Valid Flush: 'No' pre-conditions: Id: - NoObj Discipline: all State: all - enabled-by: true post-conditions: Status: Ok Name: Invalid Flush: 'No' pre-conditions: Id: - Binary Discipline: all State: - GtZeroOrNoOwner - enabled-by: true post-conditions: Status: InUse Name: Valid Flush: 'No' pre-conditions: Id: - Binary Discipline: all State: - Zero - Blocked - enabled-by: true post-conditions: NeedsPriorityDiscipline pre-conditions: Id: - PrioCeiling - PrioInherit - MrsP Discipline: - FIFO State: all - enabled-by: true post-conditions: Status: Ok Name: Invalid Flush: 'No' pre-conditions: Id: - PrioCeiling - PrioInherit - MrsP Discipline: - Priority State: - GtZeroOrNoOwner - enabled-by: true post-conditions: Status: InUse Name: Valid Flush: 'No' pre-conditions: Id: - PrioCeiling - PrioInherit - MrsP Discipline: - Priority State: - Zero - Blocked - enabled-by: true post-conditions: Status: Ok Name: Invalid Flush: - if: pre-conditions: State: Blocked then-specified-by: Discipline - else: 'No' pre-conditions: default type: requirement