summaryrefslogtreecommitdiffstats
path: root/testsuites/smptests
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-10-31 16:23:13 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-11-03 11:19:34 +0100
commit9e7fa07169083baebcac7aea9b13c61a8c27660e (patch)
tree592a2f6c12e5baf7b156a68169a5f83eebbc2d0f /testsuites/smptests
parentscore: Introduce thread resource count methods (diff)
downloadrtems-9e7fa07169083baebcac7aea9b13c61a8c27660e.tar.bz2
score: Relax _Scheduler_Set() restrictions
No longer unconditionally prevent scheduler changes if the thread owns resources. Prevent a scheduler change only in case other threads wait for the resource.
Diffstat (limited to 'testsuites/smptests')
-rw-r--r--testsuites/smptests/smpscheduler02/init.c60
1 files changed, 42 insertions, 18 deletions
diff --git a/testsuites/smptests/smpscheduler02/init.c b/testsuites/smptests/smpscheduler02/init.c
index 660346e316..7708576ae9 100644
--- a/testsuites/smptests/smpscheduler02/init.c
+++ b/testsuites/smptests/smpscheduler02/init.c
@@ -25,8 +25,6 @@
const char rtems_test_name[] = "SMPSCHEDULER 2";
-#if defined(__RTEMS_HAVE_SYS_CPUSET_H__)
-
#define SCHED_A rtems_build_name(' ', ' ', ' ', 'A')
#define SCHED_B rtems_build_name(' ', ' ', ' ', 'B')
@@ -35,7 +33,9 @@ const char rtems_test_name[] = "SMPSCHEDULER 2";
static rtems_id main_task_id;
-static rtems_id sema_id;
+static rtems_id cmtx_id;
+
+static rtems_id imtx_id;
static void task(rtems_task_argument arg)
{
@@ -47,12 +47,21 @@ static void task(rtems_task_argument arg)
rtems_test_assert(sched_get_priority_min(SCHED_RR) == 1);
rtems_test_assert(sched_get_priority_max(SCHED_RR) == 126);
- sc = rtems_semaphore_obtain(sema_id, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
+ sc = rtems_semaphore_obtain(cmtx_id, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
rtems_test_assert(sc == RTEMS_NOT_DEFINED);
sc = rtems_event_transient_send(main_task_id);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+ sc = rtems_semaphore_obtain(imtx_id, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_semaphore_release(imtx_id);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_event_transient_send(main_task_id);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
while (1) {
/* Do nothing */
}
@@ -102,22 +111,31 @@ static void test(void)
rtems_test_assert(sc == RTEMS_UNSATISFIED);
sc = rtems_semaphore_create(
- SCHED_A,
+ rtems_build_name('C', 'M', 'T', 'X'),
1,
RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_PRIORITY_CEILING,
1,
- &sema_id
+ &cmtx_id
+ );
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_semaphore_create(
+ rtems_build_name('I', 'M', 'T', 'X'),
+ 1,
+ RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_INHERIT_PRIORITY,
+ 1,
+ &imtx_id
);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
prio = 2;
- sc = rtems_semaphore_set_priority(sema_id, scheduler_a_id, prio, &prio);
+ sc = rtems_semaphore_set_priority(cmtx_id, scheduler_a_id, prio, &prio);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
rtems_test_assert(prio == 1);
if (cpu_count > 1) {
prio = 1;
- sc = rtems_semaphore_set_priority(sema_id, scheduler_b_id, prio, &prio);
+ sc = rtems_semaphore_set_priority(cmtx_id, scheduler_b_id, prio, &prio);
rtems_test_assert(sc == RTEMS_NOT_DEFINED);
rtems_test_assert(prio == 2);
}
@@ -197,6 +215,9 @@ static void test(void)
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
rtems_test_assert(scheduler_id == scheduler_b_id);
+ sc = rtems_semaphore_obtain(imtx_id, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
sc = rtems_task_start(task_id, task, 0);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
@@ -205,24 +226,27 @@ static void test(void)
sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_task_set_scheduler(RTEMS_SELF, scheduler_b_id, 1);
+ rtems_test_assert(sc == RTEMS_RESOURCE_IN_USE);
+
+ sc = rtems_semaphore_release(imtx_id);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
}
sc = rtems_task_delete(task_id);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
- sc = rtems_semaphore_delete(sema_id);
+ sc = rtems_semaphore_delete(cmtx_id);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
-}
-#else /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */
-
-static void test(void)
-{
- /* Nothing to do */
+ sc = rtems_semaphore_delete(imtx_id);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
}
-#endif /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */
-
static void Init(rtems_task_argument arg)
{
rtems_resource_snapshot snapshot;
@@ -243,7 +267,7 @@ static void Init(rtems_task_argument arg)
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
#define CONFIGURE_MAXIMUM_TASKS 2
-#define CONFIGURE_MAXIMUM_SEMAPHORES 1
+#define CONFIGURE_MAXIMUM_SEMAPHORES 2
#define CONFIGURE_SMP_APPLICATION