diff options
author | Joel Sherrill <joel.sherrill@oarcorp.com> | 2015-05-21 18:08:32 -0500 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@oarcorp.com> | 2015-05-21 18:08:32 -0500 |
commit | 24acc6d0c092c244881dd6ffadc3782a8136fccc (patch) | |
tree | 864b4985a7a431bd3520e9d815927eee5315c2df /testsuites/smptests/smpscheduler03/init.c | |
parent | Merge branch 'master' of ssh://dispatch.rtems.org/data/git/rtems (diff) | |
parent | doc: Add new documentation section for Epiphany architecture (diff) | |
download | rtems-24acc6d0c092c244881dd6ffadc3782a8136fccc.tar.bz2 |
Merge branch 'master' of ssh://dispatch.rtems.org/data/git/rtems
Diffstat (limited to 'testsuites/smptests/smpscheduler03/init.c')
-rw-r--r-- | testsuites/smptests/smpscheduler03/init.c | 137 |
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); } |