summaryrefslogtreecommitdiffstats
path: root/testsuites/sptests/spintrcritical22/init.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2020-07-18 22:55:51 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2020-07-23 09:27:47 +0200
commit1414e710dbeb552420c5d2128b50c1677ab2813f (patch)
tree41c9b31063444cf86efdf900053a596302938d54 /testsuites/sptests/spintrcritical22/init.c
parentspintrcritical21: Use T_interrupt_test() (diff)
downloadrtems-1414e710dbeb552420c5d2128b50c1677ab2813f.tar.bz2
spintrcritical22: Use T_interrupt_test()
Diffstat (limited to 'testsuites/sptests/spintrcritical22/init.c')
-rw-r--r--testsuites/sptests/spintrcritical22/init.c103
1 files changed, 66 insertions, 37 deletions
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@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