[PATCH 30/33] spintrcritical22: Use T_interrupt_test()
Sebastian Huber
sebastian.huber at embedded-brains.de
Tue Jul 21 15:04:47 UTC 2020
---
testsuites/sptests/Makefile.am | 4 +-
testsuites/sptests/spintrcritical22/init.c | 103 +++++++++++-------
.../spintrcritical22/spintrcritical22.scn | 20 ++++
3 files changed, 87 insertions(+), 40 deletions(-)
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
- * <rtems at embedded-brains.de>
+ * 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 <tmacros.h>
-#include <intrcritical.h>
+#include <rtems/test.h>
+
#include <rtems/rtems/semimpl.h>
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 ***
--
2.26.2
More information about the devel
mailing list