summaryrefslogtreecommitdiffstats
path: root/testsuites/smptests/smpscheduler03/init.c
diff options
context:
space:
mode:
Diffstat (limited to 'testsuites/smptests/smpscheduler03/init.c')
-rw-r--r--testsuites/smptests/smpscheduler03/init.c137
1 files changed, 81 insertions, 56 deletions
diff --git a/testsuites/smptests/smpscheduler03/init.c b/testsuites/smptests/smpscheduler03/init.c
index d919482c8a..3a068a24b7 100644
--- a/testsuites/smptests/smpscheduler03/init.c
+++ b/testsuites/smptests/smpscheduler03/init.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014 embedded brains GmbH. All rights reserved.
+ * Copyright (c) 2014-2015 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
@@ -40,6 +40,30 @@ typedef struct {
static test_context test_instance;
+static bool change_priority_filter(
+ Thread_Control *thread,
+ Priority_Control *new_priority,
+ void *arg
+)
+{
+ return thread->current_priority != *new_priority;
+}
+
+static void change_priority(
+ Thread_Control *thread,
+ Priority_Control new_priority,
+ bool prepend_it
+)
+{
+ _Thread_Change_priority(
+ thread,
+ new_priority,
+ NULL,
+ change_priority_filter,
+ prepend_it
+ );
+}
+
static void barrier_wait(test_context *ctx)
{
rtems_status_code sc;
@@ -95,12 +119,16 @@ static void test_case_change_priority(
Scheduler_SMP_Node_state new_state
)
{
+ Per_CPU_Control *cpu_self;
+
+ cpu_self = _Thread_Dispatch_disable();
+
switch (start_state) {
case SCHEDULER_SMP_NODE_SCHEDULED:
- _Thread_Change_priority(executing, 1, true);
+ change_priority(executing, 1, true);
break;
case SCHEDULER_SMP_NODE_READY:
- _Thread_Change_priority(executing, 4, true);
+ change_priority(executing, 4, true);
break;
default:
rtems_test_assert(0);
@@ -108,8 +136,13 @@ static void test_case_change_priority(
}
rtems_test_assert(node->state == start_state);
- _Thread_Change_priority(executing, prio, prepend_it);
+ change_priority(executing, prio, prepend_it);
rtems_test_assert(node->state == new_state);
+
+ change_priority(executing, 1, true);
+ rtems_test_assert(node->state == SCHEDULER_SMP_NODE_SCHEDULED);
+
+ _Thread_Dispatch_enable( cpu_self );
}
static const Scheduler_SMP_Node_state states[2] = {
@@ -132,11 +165,8 @@ static void test_change_priority(void)
size_t k;
task_id = start_task(3);
-
- _Thread_Disable_dispatch();
-
- executing = _Thread_Executing;
- node = _Scheduler_SMP_Thread_get_node( executing );
+ executing = _Thread_Get_executing();
+ node = _Scheduler_SMP_Thread_get_node(executing);
for (i = 0; i < RTEMS_ARRAY_SIZE(states); ++i) {
for (j = 0; j < RTEMS_ARRAY_SIZE(priorities); ++j) {
@@ -153,11 +183,6 @@ static void test_change_priority(void)
}
}
- _Thread_Change_priority(executing, 1, true);
- rtems_test_assert(node->state == SCHEDULER_SMP_NODE_SCHEDULED);
-
- _Thread_Enable_dispatch();
-
sc = rtems_task_delete(task_id);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
}
@@ -196,13 +221,16 @@ static void test_case_change_priority_op(
)
{
Thread_Control *needs_help;
+ Per_CPU_Control *cpu_self;
+
+ cpu_self = _Thread_Dispatch_disable();
switch (start_state) {
case SCHEDULER_SMP_NODE_SCHEDULED:
- _Thread_Change_priority(executing, 1, true);
+ change_priority(executing, 1, true);
break;
case SCHEDULER_SMP_NODE_READY:
- _Thread_Change_priority(executing, 4, true);
+ change_priority(executing, 4, true);
break;
default:
rtems_test_assert(0);
@@ -228,6 +256,11 @@ static void test_case_change_priority_op(
} else {
rtems_test_assert(needs_help == NULL);
}
+
+ change_priority(executing, 1, true);
+ rtems_test_assert(executing_node->state == SCHEDULER_SMP_NODE_SCHEDULED);
+
+ _Thread_Dispatch_enable( cpu_self );
}
static void test_change_priority_op(void)
@@ -242,10 +275,7 @@ static void test_change_priority_op(void)
size_t k;
task_id = start_task(3);
-
- _Thread_Disable_dispatch();
-
- executing = _Thread_Executing;
+ executing = _Thread_Get_executing();
executing_node = _Scheduler_SMP_Thread_get_node(executing);
other = get_thread_by_id(task_id);
@@ -266,11 +296,6 @@ static void test_change_priority_op(void)
}
}
- _Thread_Change_priority(executing, 1, true);
- rtems_test_assert(executing_node->state == SCHEDULER_SMP_NODE_SCHEDULED);
-
- _Thread_Enable_dispatch();
-
sc = rtems_task_delete(task_id);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
}
@@ -279,11 +304,11 @@ static Thread_Control *yield_op(Thread_Control *thread)
{
const Scheduler_Control *scheduler = _Scheduler_Get(thread);
Thread_Control *needs_help;
- ISR_Level level;
+ ISR_lock_Context lock_context;
- _ISR_Disable( level );
+ _Scheduler_Acquire(thread, &lock_context);
needs_help = (*scheduler->Operations.yield)(scheduler, thread);
- _ISR_Enable( level );
+ _Scheduler_Release(thread, &lock_context);
return needs_help;
}
@@ -297,20 +322,23 @@ static void test_case_yield_op(
)
{
Thread_Control *needs_help;
+ Per_CPU_Control *cpu_self;
+
+ cpu_self = _Thread_Dispatch_disable();
- _Thread_Change_priority(executing, 4, false);
- _Thread_Change_priority(other, 4, false);
+ change_priority(executing, 4, false);
+ change_priority(other, 4, false);
switch (start_state) {
case SCHEDULER_SMP_NODE_SCHEDULED:
switch (new_state) {
case SCHEDULER_SMP_NODE_SCHEDULED:
- _Thread_Change_priority(executing, 2, false);
- _Thread_Change_priority(other, 3, false);
+ change_priority(executing, 2, false);
+ change_priority(other, 3, false);
break;
case SCHEDULER_SMP_NODE_READY:
- _Thread_Change_priority(executing, 2, false);
- _Thread_Change_priority(other, 2, false);
+ change_priority(executing, 2, false);
+ change_priority(other, 2, false);
break;
default:
rtems_test_assert(0);
@@ -323,8 +351,8 @@ static void test_case_yield_op(
rtems_test_assert(0);
break;
case SCHEDULER_SMP_NODE_READY:
- _Thread_Change_priority(executing, 3, false);
- _Thread_Change_priority(other, 2, false);
+ change_priority(executing, 3, false);
+ change_priority(other, 2, false);
break;
default:
rtems_test_assert(0);
@@ -355,6 +383,11 @@ static void test_case_yield_op(
} else {
rtems_test_assert(needs_help == NULL);
}
+
+ change_priority(executing, 1, true);
+ rtems_test_assert(executing_node->state == SCHEDULER_SMP_NODE_SCHEDULED);
+
+ _Thread_Dispatch_enable( cpu_self );
}
static void test_yield_op(void)
@@ -368,10 +401,7 @@ static void test_yield_op(void)
size_t j;
task_id = start_task(2);
-
- _Thread_Disable_dispatch();
-
- executing = _Thread_Executing;
+ executing = _Thread_Get_executing();
executing_node = _Scheduler_SMP_Thread_get_node(executing);
other = get_thread_by_id(task_id);
@@ -393,11 +423,6 @@ static void test_yield_op(void)
}
}
- _Thread_Change_priority(executing, 1, true);
- rtems_test_assert(executing_node->state == SCHEDULER_SMP_NODE_SCHEDULED);
-
- _Thread_Enable_dispatch();
-
sc = rtems_task_delete(task_id);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
}
@@ -433,14 +458,17 @@ static void test_case_unblock_op(
)
{
Thread_Control *needs_help;
+ Per_CPU_Control *cpu_self;
+
+ cpu_self = _Thread_Dispatch_disable();
switch (new_state) {
case SCHEDULER_SMP_NODE_SCHEDULED:
- _Thread_Change_priority(executing, 2, false);
+ change_priority(executing, 2, false);
rtems_test_assert(executing_node->state == SCHEDULER_SMP_NODE_SCHEDULED);
break;
case SCHEDULER_SMP_NODE_READY:
- _Thread_Change_priority(executing, 4, false);
+ change_priority(executing, 4, false);
rtems_test_assert(executing_node->state == SCHEDULER_SMP_NODE_READY);
break;
default:
@@ -465,6 +493,11 @@ static void test_case_unblock_op(
rtems_test_assert(0);
break;
}
+
+ change_priority(executing, 1, true);
+ rtems_test_assert(executing_node->state == SCHEDULER_SMP_NODE_SCHEDULED);
+
+ _Thread_Dispatch_enable( cpu_self );
}
static void test_unblock_op(void)
@@ -477,10 +510,7 @@ static void test_unblock_op(void)
size_t i;
task_id = start_task(3);
-
- _Thread_Disable_dispatch();
-
- executing = _Thread_Executing;
+ executing = _Thread_Get_executing();
executing_node = _Scheduler_SMP_Thread_get_node(executing);
other = get_thread_by_id(task_id);
@@ -494,11 +524,6 @@ static void test_unblock_op(void)
);
}
- _Thread_Change_priority(executing, 1, true);
- rtems_test_assert(executing_node->state == SCHEDULER_SMP_NODE_SCHEDULED);
-
- _Thread_Enable_dispatch();
-
sc = rtems_task_delete(task_id);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
}