summaryrefslogtreecommitdiffstats
path: root/testsuites/smptests/smppsxmutex01/init.c
diff options
context:
space:
mode:
Diffstat (limited to 'testsuites/smptests/smppsxmutex01/init.c')
-rw-r--r--testsuites/smptests/smppsxmutex01/init.c184
1 files changed, 184 insertions, 0 deletions
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>