summaryrefslogtreecommitdiffstats
path: root/testsuites/smptests/smppsxmutex01
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-06-10 08:48:54 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-06-22 14:36:40 +0200
commit77ff5599e0d8e6d91190a379be21a332f83252b0 (patch)
tree339e28b236beb9e606322cb801d7340e2e44f8bf /testsuites/smptests/smppsxmutex01
parentscore: Delete unused _Scheduler_Priority_compare() (diff)
downloadrtems-77ff5599e0d8e6d91190a379be21a332f83252b0.tar.bz2
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.
Diffstat (limited to 'testsuites/smptests/smppsxmutex01')
-rw-r--r--testsuites/smptests/smppsxmutex01/Makefile.am19
-rw-r--r--testsuites/smptests/smppsxmutex01/init.c184
-rw-r--r--testsuites/smptests/smppsxmutex01/smppsxmutex01.doc12
-rw-r--r--testsuites/smptests/smppsxmutex01/smppsxmutex01.scn2
4 files changed, 217 insertions, 0 deletions
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
+ * <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.org/license/LICENSE.
+ */
+
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <errno.h>
+#include <pthread.h>
+
+#include <rtems.h>
+#include <rtems/libcsupport.h>
+
+#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.h>
+
+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 <rtems/confdefs.h>
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 ***