diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-10-21 09:23:58 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-11-02 10:05:43 +0100 |
commit | 3a2724805421098df505c0acea106fb294bc2f6a (patch) | |
tree | 07b225c4fdc140786851750df34433526ed2ddff /testsuites/smptests | |
parent | score: Use scheduler instance specific locks (diff) | |
download | rtems-3a2724805421098df505c0acea106fb294bc2f6a.tar.bz2 |
score: First part of new MrsP implementation
Update #2556.
Diffstat (limited to 'testsuites/smptests')
-rw-r--r-- | testsuites/smptests/Makefile.am | 1 | ||||
-rw-r--r-- | testsuites/smptests/configure.ac | 1 | ||||
-rw-r--r-- | testsuites/smptests/smpfatal03/Makefile.am | 19 | ||||
-rw-r--r-- | testsuites/smptests/smpfatal03/init.c | 108 | ||||
-rw-r--r-- | testsuites/smptests/smpfatal03/smpfatal03.doc | 12 | ||||
-rw-r--r-- | testsuites/smptests/smpfatal03/smpfatal03.scn | 2 | ||||
-rw-r--r-- | testsuites/smptests/smpmrsp01/init.c | 118 |
7 files changed, 206 insertions, 55 deletions
diff --git a/testsuites/smptests/Makefile.am b/testsuites/smptests/Makefile.am index 02d1dfce92..63398e3162 100644 --- a/testsuites/smptests/Makefile.am +++ b/testsuites/smptests/Makefile.am @@ -17,6 +17,7 @@ SUBDIRS += smpcapture02 SUBDIRS += smpclock01 SUBDIRS += smpfatal01 SUBDIRS += smpfatal02 +SUBDIRS += smpfatal03 SUBDIRS += smpfatal04 SUBDIRS += smpfatal05 SUBDIRS += smpfatal08 diff --git a/testsuites/smptests/configure.ac b/testsuites/smptests/configure.ac index 8c8476f8fc..6c632ce406 100644 --- a/testsuites/smptests/configure.ac +++ b/testsuites/smptests/configure.ac @@ -75,6 +75,7 @@ smpcapture02/Makefile smpclock01/Makefile smpfatal01/Makefile smpfatal02/Makefile +smpfatal03/Makefile smpfatal04/Makefile smpfatal05/Makefile smpfatal08/Makefile diff --git a/testsuites/smptests/smpfatal03/Makefile.am b/testsuites/smptests/smpfatal03/Makefile.am new file mode 100644 index 0000000000..4ec2862357 --- /dev/null +++ b/testsuites/smptests/smpfatal03/Makefile.am @@ -0,0 +1,19 @@ +rtems_tests_PROGRAMS = smpfatal03 +smpfatal03_SOURCES = init.c + +dist_rtems_tests_DATA = smpfatal03.scn smpfatal03.doc + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../automake/compile.am +include $(top_srcdir)/../automake/leaf.am + +AM_CPPFLAGS += -I$(top_srcdir)/../support/include + +LINK_OBJS = $(smpfatal03_OBJECTS) +LINK_LIBS = $(smpfatal03_LDLIBS) + +smpfatal03$(EXEEXT): $(smpfatal03_OBJECTS) $(smpfatal03_DEPENDENCIES) + @rm -f smpfatal03$(EXEEXT) + $(make-exe) + +include $(top_srcdir)/../automake/local.am diff --git a/testsuites/smptests/smpfatal03/init.c b/testsuites/smptests/smpfatal03/init.c new file mode 100644 index 0000000000..0eb15aae81 --- /dev/null +++ b/testsuites/smptests/smpfatal03/init.c @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2016 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * <rtems@embedded-brains.de> + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define TESTS_USE_PRINTK +#include "tmacros.h" + +const char rtems_test_name[] = "SMPFATAL 3"; + +static void task(rtems_task_argument arg) +{ + rtems_status_code sc; + rtems_id *sem_id; + + sem_id = (rtems_id *) arg; + + sc = rtems_semaphore_obtain(*sem_id, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_wake_after(RTEMS_YIELD_PROCESSOR); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + rtems_test_assert(0); +} + +static void Init(rtems_task_argument arg) +{ + rtems_status_code sc; + rtems_id task_id; + rtems_id sem_id; + + TEST_BEGIN(); + + sc = rtems_semaphore_create( + rtems_build_name('M', 'R', 'S', 'P'), + 1, + RTEMS_MULTIPROCESSOR_RESOURCE_SHARING + | RTEMS_BINARY_SEMAPHORE, + 1, + &sem_id + ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_create( + rtems_build_name('T', 'A', 'S', 'K'), + 1, + RTEMS_MINIMUM_STACK_SIZE, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &task_id + ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_start(task_id, task, (rtems_task_argument) &sem_id); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_wake_after(RTEMS_YIELD_PROCESSOR); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + _Thread_Dispatch_disable(); + rtems_semaphore_obtain(sem_id, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + rtems_test_assert(0); +} + +static void fatal_extension( + rtems_fatal_source source, + bool is_internal, + rtems_fatal_code code +) +{ + if ( + source == INTERNAL_ERROR_CORE + && !is_internal + && code == INTERNAL_ERROR_THREAD_QUEUE_ENQUEUE_STICKY_FROM_BAD_STATE + ) { + TEST_END(); + } +} + +#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER + +#define CONFIGURE_INITIAL_EXTENSIONS \ + { .fatal = fatal_extension }, \ + RTEMS_TEST_INITIAL_EXTENSION + +#define CONFIGURE_MAXIMUM_TASKS 2 +#define CONFIGURE_MAXIMUM_MRSP_SEMAPHORES 1 + +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE + +#define CONFIGURE_INIT + +#include <rtems/confdefs.h> diff --git a/testsuites/smptests/smpfatal03/smpfatal03.doc b/testsuites/smptests/smpfatal03/smpfatal03.doc new file mode 100644 index 0000000000..6d7e829a00 --- /dev/null +++ b/testsuites/smptests/smpfatal03/smpfatal03.doc @@ -0,0 +1,12 @@ +This file describes the directives and concepts tested by this test set. + +test set name: smpfatal03 + +directives: + + - _Thread_queue_Enqueue_sticky() + +concepts: + + - Trigger the INTERNAL_ERROR_THREAD_QUEUE_ENQUEUE_STICKY_FROM_BAD_STATE fatal + error. diff --git a/testsuites/smptests/smpfatal03/smpfatal03.scn b/testsuites/smptests/smpfatal03/smpfatal03.scn new file mode 100644 index 0000000000..5ec996f50b --- /dev/null +++ b/testsuites/smptests/smpfatal03/smpfatal03.scn @@ -0,0 +1,2 @@ +*** BEGIN OF TEST SMPFATAL 3 *** +*** END OF TEST SMPFATAL 3 *** diff --git a/testsuites/smptests/smpmrsp01/init.c b/testsuites/smptests/smpmrsp01/init.c index efc997a268..de5f31c8cb 100644 --- a/testsuites/smptests/smpmrsp01/init.c +++ b/testsuites/smptests/smpmrsp01/init.c @@ -214,6 +214,37 @@ static void print_switch_events(test_context *ctx) } } +static void create_timer(test_context *ctx) +{ + rtems_status_code sc; + + sc = rtems_timer_create( + rtems_build_name('T', 'I', 'M', 'R'), + &ctx->timer_id + ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); +} + +static void delete_timer(test_context *ctx) +{ + rtems_status_code sc; + + sc = rtems_timer_delete(ctx->timer_id); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); +} + +static void fire_timer( + test_context *ctx, + rtems_interval interval, + rtems_timer_service_routine_entry routine +) +{ + rtems_status_code sc; + + sc = rtems_timer_fire_after(ctx->timer_id, interval, routine, ctx); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); +} + static void create_mrsp_sema( test_context *ctx, rtems_id *id, @@ -744,37 +775,11 @@ static void test_mrsp_nested_obtain_error(test_context *ctx) rtems_test_assert(sc == RTEMS_SUCCESSFUL); } -static void test_mrsp_unlock_order_error(test_context *ctx) +static void deadlock_timer(rtems_id timer_id, void *arg) { - rtems_status_code sc; - rtems_id id_a; - rtems_id id_b; - - puts("test MrsP unlock order error"); - - create_mrsp_sema(ctx, &id_a, 1); - create_mrsp_sema(ctx, &id_b, 1); - - sc = rtems_semaphore_obtain(id_a, RTEMS_WAIT, RTEMS_NO_TIMEOUT); - rtems_test_assert(sc == RTEMS_SUCCESSFUL); - - sc = rtems_semaphore_obtain(id_b, RTEMS_WAIT, RTEMS_NO_TIMEOUT); - rtems_test_assert(sc == RTEMS_SUCCESSFUL); - - sc = rtems_semaphore_release(id_a); - rtems_test_assert(sc == RTEMS_INCORRECT_STATE); - - sc = rtems_semaphore_release(id_b); - rtems_test_assert(sc == RTEMS_SUCCESSFUL); - - sc = rtems_semaphore_release(id_a); - rtems_test_assert(sc == RTEMS_SUCCESSFUL); - - sc = rtems_semaphore_delete(id_a); - rtems_test_assert(sc == RTEMS_SUCCESSFUL); + test_context *ctx = arg; - sc = rtems_semaphore_delete(id_b); - rtems_test_assert(sc == RTEMS_SUCCESSFUL); + change_prio(ctx->main_task_id, 1); } static void deadlock_worker(rtems_task_argument arg) @@ -785,6 +790,8 @@ static void deadlock_worker(rtems_task_argument arg) sc = rtems_semaphore_obtain(ctx->mrsp_ids[1], RTEMS_WAIT, RTEMS_NO_TIMEOUT); rtems_test_assert(sc == RTEMS_SUCCESSFUL); + fire_timer(ctx, 2, deadlock_timer); + sc = rtems_semaphore_obtain(ctx->mrsp_ids[0], RTEMS_WAIT, RTEMS_NO_TIMEOUT); rtems_test_assert(sc == RTEMS_SUCCESSFUL); @@ -810,6 +817,7 @@ static void test_mrsp_deadlock_error(test_context *ctx) change_prio(RTEMS_SELF, prio); + create_timer(ctx); create_mrsp_sema(ctx, &ctx->mrsp_ids[0], prio); create_mrsp_sema(ctx, &ctx->mrsp_ids[1], prio); @@ -832,8 +840,26 @@ static void test_mrsp_deadlock_error(test_context *ctx) sc = rtems_task_wake_after(RTEMS_YIELD_PROCESSOR); rtems_test_assert(sc == RTEMS_SUCCESSFUL); + prio = 1; + sc = rtems_semaphore_set_priority( + ctx->mrsp_ids[1], + ctx->scheduler_ids[0], + prio, + &prio + ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + rtems_test_assert(prio == 2); + sc = rtems_semaphore_obtain(ctx->mrsp_ids[1], RTEMS_WAIT, RTEMS_NO_TIMEOUT); - rtems_test_assert(sc == RTEMS_UNSATISFIED); + rtems_test_assert(sc == RTEMS_INCORRECT_STATE); + + sc = rtems_semaphore_set_priority( + ctx->mrsp_ids[1], + ctx->scheduler_ids[0], + prio, + &prio + ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_semaphore_release(ctx->mrsp_ids[0]); rtems_test_assert(sc == RTEMS_SUCCESSFUL); @@ -849,6 +875,8 @@ static void test_mrsp_deadlock_error(test_context *ctx) sc = rtems_semaphore_delete(ctx->mrsp_ids[1]); rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + delete_timer(ctx); } static void test_mrsp_multiple_obtain(test_context *ctx) @@ -1006,8 +1034,7 @@ static void unblock_ready_owner(test_context *ctx) assert_prio(RTEMS_SELF, 3); - sc = rtems_timer_fire_after(ctx->timer_id, 2, unblock_ready_timer, ctx); - rtems_test_assert(sc == RTEMS_SUCCESSFUL); + fire_timer(ctx, 2, unblock_ready_timer); sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT); rtems_test_assert(sc == RTEMS_SUCCESSFUL); @@ -1103,13 +1130,7 @@ static void various_block_unblock(test_context *ctx) * user. */ - sc = rtems_timer_fire_after( - ctx->timer_id, - 2, - unblock_owner_before_rival_timer, - ctx - ); - rtems_test_assert(sc == RTEMS_SUCCESSFUL); + fire_timer(ctx, 2, unblock_owner_before_rival_timer); /* This will take the processor away from us, the timer will help later */ sc = rtems_task_resume(ctx->high_task_id[1]); @@ -1123,13 +1144,7 @@ static void various_block_unblock(test_context *ctx) sc = rtems_task_resume(ctx->high_task_id[0]); rtems_test_assert(sc == RTEMS_SUCCESSFUL); - sc = rtems_timer_fire_after( - ctx->timer_id, - 2, - unblock_owner_after_rival_timer, - ctx - ); - rtems_test_assert(sc == RTEMS_SUCCESSFUL); + fire_timer(ctx, 2, unblock_owner_after_rival_timer); /* This will take the processor away from us, the timer will help later */ sc = rtems_task_resume(ctx->high_task_id[1]); @@ -1229,11 +1244,7 @@ static void test_mrsp_various_block_and_unblock(test_context *ctx) sc = rtems_task_start(ctx->worker_ids[0], ready_unlock_worker, 0); rtems_test_assert(sc == RTEMS_SUCCESSFUL); - sc = rtems_timer_create( - rtems_build_name('T', 'I', 'M', 'R'), - &ctx->timer_id - ); - rtems_test_assert(sc == RTEMS_SUCCESSFUL); + create_timer(ctx); /* In case these tasks run, then we have a MrsP protocol violation */ start_low_task(ctx, 0); @@ -1246,9 +1257,7 @@ static void test_mrsp_various_block_and_unblock(test_context *ctx) rtems_test_assert(!ctx->low_run[1]); print_switch_events(ctx); - - sc = rtems_timer_delete(ctx->timer_id); - rtems_test_assert(sc == RTEMS_SUCCESSFUL); + delete_timer(ctx); sc = rtems_task_delete(ctx->high_task_id[0]); rtems_test_assert(sc == RTEMS_SUCCESSFUL); @@ -1749,7 +1758,6 @@ static void Init(rtems_task_argument arg) test_mrsp_flush_error(ctx); test_mrsp_initially_locked_error(); test_mrsp_nested_obtain_error(ctx); - test_mrsp_unlock_order_error(ctx); test_mrsp_deadlock_error(ctx); test_mrsp_multiple_obtain(ctx); |