From 77ff5599e0d8e6d91190a379be21a332f83252b0 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 10 Jun 2016 08:48:54 +0200 Subject: score: Introduce map priority scheduler operation Introduce map/unmap priority scheduler operations to map thread priority values from/to the user domain to/from the scheduler domain. Use the map priority operation to validate the thread priority. The EDF schedulers use this new operation to distinguish between normal priorities and priorities obtain through a job release. Update #2173. Update #2556. --- testsuites/smptests/smppsxmutex01/Makefile.am | 19 +++ testsuites/smptests/smppsxmutex01/init.c | 184 +++++++++++++++++++++ .../smptests/smppsxmutex01/smppsxmutex01.doc | 12 ++ .../smptests/smppsxmutex01/smppsxmutex01.scn | 2 + 4 files changed, 217 insertions(+) create mode 100644 testsuites/smptests/smppsxmutex01/Makefile.am create mode 100644 testsuites/smptests/smppsxmutex01/init.c create mode 100644 testsuites/smptests/smppsxmutex01/smppsxmutex01.doc create mode 100644 testsuites/smptests/smppsxmutex01/smppsxmutex01.scn (limited to 'testsuites/smptests/smppsxmutex01') diff --git a/testsuites/smptests/smppsxmutex01/Makefile.am b/testsuites/smptests/smppsxmutex01/Makefile.am new file mode 100644 index 0000000000..0b09b16bd9 --- /dev/null +++ b/testsuites/smptests/smppsxmutex01/Makefile.am @@ -0,0 +1,19 @@ +rtems_tests_PROGRAMS = smppsxmutex01 +smppsxmutex01_SOURCES = init.c + +dist_rtems_tests_DATA = smppsxmutex01.scn smppsxmutex01.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 = $(smppsxmutex01_OBJECTS) +LINK_LIBS = $(smppsxmutex01_LDLIBS) + +smppsxmutex01$(EXEEXT): $(smppsxmutex01_OBJECTS) $(smppsxmutex01_DEPENDENCIES) + @rm -f smppsxmutex01$(EXEEXT) + $(make-exe) + +include $(top_srcdir)/../automake/local.am diff --git a/testsuites/smptests/smppsxmutex01/init.c b/testsuites/smptests/smppsxmutex01/init.c new file mode 100644 index 0000000000..761b5b9d51 --- /dev/null +++ b/testsuites/smptests/smppsxmutex01/init.c @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2016 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#include +#include + +#include +#include + +#include "tmacros.h" + +const char rtems_test_name[] = "SMPPSXMUTEX 1"; + +#define SCHED_A rtems_build_name(' ', ' ', ' ', 'A') + +#define SCHED_B rtems_build_name(' ', ' ', ' ', 'B') + +typedef struct { + pthread_t thread_b; + pthread_mutexattr_t mtx_attr; + pthread_mutex_t mtx_a; + pthread_mutex_t mtx_b; +} test_context; + +static test_context test_instance; + +static void *thread_b(void *arg) +{ + test_context *ctx; + rtems_id scheduler_b_id; + rtems_status_code sc; + int prio_ceiling; + int eno; + + ctx = arg; + + rtems_test_assert(rtems_get_current_processor() == 0); + + sc = rtems_scheduler_ident(SCHED_B, &scheduler_b_id); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_set_scheduler(pthread_self(), scheduler_b_id); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + rtems_test_assert(rtems_get_current_processor() == 1); + + eno = pthread_mutex_init(&ctx->mtx_b, &ctx->mtx_attr); + rtems_test_assert(eno == 0); + + eno = pthread_mutex_getprioceiling(&ctx->mtx_b, &prio_ceiling); + rtems_test_assert(eno == 0); + rtems_test_assert(prio_ceiling == 254); + + eno = pthread_mutex_lock(&ctx->mtx_b); + rtems_test_assert(eno == 0); + + eno = pthread_mutex_unlock(&ctx->mtx_b); + rtems_test_assert(eno == 0); + + eno = pthread_mutex_destroy(&ctx->mtx_b); + rtems_test_assert(eno == 0); + + eno = pthread_mutex_getprioceiling(&ctx->mtx_a, &prio_ceiling); + rtems_test_assert(eno == 0); + rtems_test_assert(prio_ceiling == 126); + + eno = pthread_mutex_lock(&ctx->mtx_a); + rtems_test_assert(eno == EINVAL); + + return ctx; +} + +static void test(test_context *ctx) +{ + uint32_t cpu_count; + int prio_ceiling; + int eno; + + cpu_count = rtems_get_processor_count(); + + rtems_test_assert(rtems_get_current_processor() == 0); + + eno = pthread_mutexattr_init(&ctx->mtx_attr); + rtems_test_assert(eno == 0); + + eno = pthread_mutexattr_setprotocol(&ctx->mtx_attr, PTHREAD_PRIO_PROTECT); + rtems_test_assert(eno == 0); + + eno = pthread_mutex_init(&ctx->mtx_a, &ctx->mtx_attr); + rtems_test_assert(eno == 0); + + eno = pthread_mutex_getprioceiling(&ctx->mtx_a, &prio_ceiling); + rtems_test_assert(eno == 0); + rtems_test_assert(prio_ceiling == 126); + + eno = pthread_mutex_lock(&ctx->mtx_a); + rtems_test_assert(eno == 0); + + eno = pthread_mutex_unlock(&ctx->mtx_a); + rtems_test_assert(eno == 0); + + if (cpu_count > 1) { + void *exit_code; + + eno = pthread_create(&ctx->thread_b, NULL, thread_b, ctx); + rtems_test_assert(eno == 0); + + exit_code = NULL; + eno = pthread_join(ctx->thread_b, &exit_code); + rtems_test_assert(eno == 0); + rtems_test_assert(exit_code == ctx); + } + + eno = pthread_mutex_destroy(&ctx->mtx_a); + rtems_test_assert(eno == 0); + + eno = pthread_mutexattr_destroy(&ctx->mtx_attr); + rtems_test_assert(eno == 0); +} + +static void *POSIX_Init(void *arg) +{ + rtems_resource_snapshot snapshot; + + TEST_BEGIN(); + + rtems_resource_snapshot_take(&snapshot); + + test(&test_instance); + + rtems_test_assert(rtems_resource_snapshot_check(&snapshot)); + + TEST_END(); + rtems_test_exit(0); +} + +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER + +#define CONFIGURE_MAXIMUM_POSIX_THREADS 2 +#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 2 + +#define CONFIGURE_SMP_APPLICATION + +#define CONFIGURE_SMP_MAXIMUM_PROCESSORS 2 + +#define CONFIGURE_SCHEDULER_PRIORITY_SMP + +#include + +RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP(a, 128); + +RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP(b, 256); + +#define CONFIGURE_SCHEDULER_CONTROLS \ + RTEMS_SCHEDULER_CONTROL_PRIORITY_SMP(a, SCHED_A), \ + RTEMS_SCHEDULER_CONTROL_PRIORITY_SMP(b, SCHED_B) \ + +#define CONFIGURE_SMP_SCHEDULER_ASSIGNMENTS \ + RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY), \ + RTEMS_SCHEDULER_ASSIGN(1, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL) + +#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION + +#define CONFIGURE_POSIX_INIT_THREAD_TABLE + +#define CONFIGURE_INIT + +#include diff --git a/testsuites/smptests/smppsxmutex01/smppsxmutex01.doc b/testsuites/smptests/smppsxmutex01/smppsxmutex01.doc new file mode 100644 index 0000000000..dd255daeda --- /dev/null +++ b/testsuites/smptests/smppsxmutex01/smppsxmutex01.doc @@ -0,0 +1,12 @@ +This file describes the directives and concepts tested by this test set. + +test set name: smppsxmutex01 + +directives: + + - pthread_mutex_lock() + +concepts: + + - Ensure that priority ceiling mutexes work only in their dedicated scheduler + instance. diff --git a/testsuites/smptests/smppsxmutex01/smppsxmutex01.scn b/testsuites/smptests/smppsxmutex01/smppsxmutex01.scn new file mode 100644 index 0000000000..e4c8a1a3ef --- /dev/null +++ b/testsuites/smptests/smppsxmutex01/smppsxmutex01.scn @@ -0,0 +1,2 @@ +*** BEGIN OF TEST SMPPSXMUTEX 1 *** +*** END OF TEST SMPPSXMUTEX 1 *** -- cgit v1.2.3