From 1414e710dbeb552420c5d2128b50c1677ab2813f Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Sat, 18 Jul 2020 22:55:51 +0200 Subject: spintrcritical22: Use T_interrupt_test() --- testsuites/sptests/Makefile.am | 4 +- testsuites/sptests/spintrcritical22/init.c | 103 +++++++++++++-------- .../sptests/spintrcritical22/spintrcritical22.scn | 20 ++++ 3 files changed, 87 insertions(+), 40 deletions(-) (limited to 'testsuites') diff --git a/testsuites/sptests/Makefile.am b/testsuites/sptests/Makefile.am index 78fe657051..f35eeed664 100644 --- a/testsuites/sptests/Makefile.am +++ b/testsuites/sptests/Makefile.am @@ -1360,9 +1360,7 @@ if TEST_spintrcritical22 sp_tests += spintrcritical22 sp_screens += spintrcritical22/spintrcritical22.scn sp_docs += spintrcritical22/spintrcritical22.doc -spintrcritical22_SOURCES = spintrcritical22/init.c \ - spintrcritical_support/intrcritical.h \ - spintrcritical_support/intrcritical.c +spintrcritical22_SOURCES = spintrcritical22/init.c spintrcritical22_CPPFLAGS = $(AM_CPPFLAGS) \ $(TEST_FLAGS_spintrcritical22) $(support_includes) \ -I$(top_srcdir)/spintrcritical_support diff --git a/testsuites/sptests/spintrcritical22/init.c b/testsuites/sptests/spintrcritical22/init.c index b7cd430867..a73499c888 100644 --- a/testsuites/sptests/spintrcritical22/init.c +++ b/testsuites/sptests/spintrcritical22/init.c @@ -1,11 +1,5 @@ /* - * Copyright (c) 2014 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * + * Copyright (C) 2014, 2020 embedded brains GmbH (http://www.embedded-brains.de) * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at @@ -17,7 +11,8 @@ #endif #include -#include +#include + #include const char rtems_test_name[] = "SPINTRCRITICAL 22"; @@ -26,11 +21,8 @@ typedef struct { rtems_id semaphore_id; Semaphore_Control *semaphore_control; Thread_Control *main_task_control; - volatile bool done; } test_context; -static test_context ctx_instance; - static Semaphore_Control *get_semaphore_control(rtems_id id) { Thread_queue_Context queue_context; @@ -43,19 +35,21 @@ static Semaphore_Control *get_semaphore_control(rtems_id id) return sem; } -static void release_semaphore(rtems_id timer, void *arg) +static T_interrupt_test_state release_semaphore(void *arg) { - /* The arg is NULL */ - test_context *ctx = &ctx_instance; + test_context *ctx = arg; rtems_status_code sc; + Thread_Wait_flags flags; + T_interrupt_test_state state; + + flags = _Thread_Wait_flags_get(ctx->main_task_control); if ( - _Thread_Wait_flags_get(ctx->main_task_control) - == (THREAD_WAIT_CLASS_OBJECT | THREAD_WAIT_STATE_INTEND_TO_BLOCK) + flags == (THREAD_WAIT_CLASS_OBJECT | THREAD_WAIT_STATE_INTEND_TO_BLOCK) ) { CORE_semaphore_Control *sem; - ctx->done = true; + state = T_INTERRUPT_TEST_DONE; sc = rtems_semaphore_release(ctx->semaphore_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); @@ -67,12 +61,33 @@ static void release_semaphore(rtems_id timer, void *arg) sem = &ctx->semaphore_control->Core_control.Semaphore; rtems_test_assert(sem->count == 0); } else { + if (flags == (THREAD_WAIT_CLASS_EVENT | THREAD_WAIT_STATE_BLOCKED)) { + state = T_INTERRUPT_TEST_LATE; + } else { + state = T_INTERRUPT_TEST_EARLY; + } + sc = rtems_semaphore_release(ctx->semaphore_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); } + + return state; +} + +static void action(void *arg) +{ + test_context *ctx = arg; + rtems_status_code sc; + + sc = rtems_semaphore_obtain( + ctx->semaphore_id, + RTEMS_WAIT, + 2 + ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); } -static bool test_body(void *arg) +static void prepare(void *arg) { test_context *ctx = arg; rtems_status_code sc; @@ -83,43 +98,59 @@ static bool test_body(void *arg) 0 ); rtems_test_assert(sc == RTEMS_SUCCESSFUL || sc == RTEMS_UNSATISFIED); +} - sc = rtems_semaphore_obtain( - ctx->semaphore_id, - RTEMS_WAIT, - 2 +static void blocked(void *arg) +{ + test_context *ctx = arg; + rtems_status_code sc; + + T_interrupt_test_change_state( + T_INTERRUPT_TEST_ACTION, + T_INTERRUPT_TEST_LATE ); - rtems_test_assert(sc == RTEMS_SUCCESSFUL || sc == RTEMS_TIMEOUT); - return ctx->done; + sc = rtems_semaphore_release(ctx->semaphore_id); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); } -static void Init(rtems_task_argument ignored) +static const T_interrupt_test_config config = { + .prepare = prepare, + .action = action, + .interrupt = release_semaphore, + .blocked = blocked, + .max_iteration_count = 10000 +}; + +T_TEST_CASE(InterruptSemaphoreObtain) { - test_context *ctx = &ctx_instance; + test_context ctx; rtems_status_code sc; + T_interrupt_test_state state; - TEST_BEGIN(); - - ctx->main_task_control = _Thread_Get_executing(); + ctx.main_task_control = _Thread_Get_executing(); sc = rtems_semaphore_create( rtems_build_name('S', 'E', 'M', 'A'), 1, RTEMS_SIMPLE_BINARY_SEMAPHORE, 0, - &ctx->semaphore_id + &ctx.semaphore_id ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); - ctx->semaphore_control = get_semaphore_control(ctx->semaphore_id); + ctx.semaphore_control = get_semaphore_control(ctx.semaphore_id); - interrupt_critical_section_test(test_body, ctx, release_semaphore); - rtems_test_assert(ctx->done); + state = T_interrupt_test(&config, &ctx); + T_eq_int(state, T_INTERRUPT_TEST_DONE); - TEST_END(); + sc = rtems_semaphore_delete(ctx.semaphore_id); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); +} - rtems_test_exit(0); +static void Init(rtems_task_argument argument) +{ + rtems_test_run(argument, TEST_STATE); } #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER @@ -129,8 +160,6 @@ static void Init(rtems_task_argument ignored) #define CONFIGURE_MAXIMUM_SEMAPHORES 1 #define CONFIGURE_MAXIMUM_TASKS 1 -#define CONFIGURE_MAXIMUM_TIMERS 1 -#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION diff --git a/testsuites/sptests/spintrcritical22/spintrcritical22.scn b/testsuites/sptests/spintrcritical22/spintrcritical22.scn index 7cf4ed2850..ed8863b98b 100644 --- a/testsuites/sptests/spintrcritical22/spintrcritical22.scn +++ b/testsuites/sptests/spintrcritical22/spintrcritical22.scn @@ -1,2 +1,22 @@ *** BEGIN OF TEST SPINTRCRITICAL 22 *** +*** TEST VERSION: 6.0.0.929e49a54ab4d2d18c9fb8d03610614f63e25b8d +*** TEST STATE: EXPECTED_PASS +*** TEST BUILD: RTEMS_DEBUG RTEMS_POSIX_API RTEMS_SMP +*** TEST TOOLS: 10.0.1 20200406 (RTEMS 6, RSB bec88a6dd856892c3e66e4598252ea07d7a0d762, Newlib ece49e4) +A:SPINTRCRITICAL 22 +S:Platform:RTEMS +S:Compiler:10.0.1 20200406 (RTEMS 6, RSB bec88a6dd856892c3e66e4598252ea07d7a0d762, Newlib ece49e4) +S:Version:6.0.0.929e49a54ab4d2d18c9fb8d03610614f63e25b8d +S:BSP:realview_pbx_a9_qemu +S:RTEMS_DEBUG:1 +S:RTEMS_MULTIPROCESSING:0 +S:RTEMS_POSIX_API:1 +S:RTEMS_PROFILING:0 +S:RTEMS_SMP:1 +B:InterruptSemaphoreObtain +P:0:0:UI1:init.c:145 +E:InterruptSemaphoreObtain:N:1:F:0:D:0.432627 +Z:SPINTRCRITICAL 22:C:1:N:1:F:0:D:0.433689 +Y:ReportHash:SHA256:0a161773566007e97ab42b4a9303b6937c1a3fceac5201aba50f9755cd880459 + *** END OF TEST SPINTRCRITICAL 22 *** -- cgit v1.2.3