diff options
Diffstat (limited to 'testsuites/sptests/spscheduler01/init.c')
-rw-r--r-- | testsuites/sptests/spscheduler01/init.c | 163 |
1 files changed, 155 insertions, 8 deletions
diff --git a/testsuites/sptests/spscheduler01/init.c b/testsuites/sptests/spscheduler01/init.c index 31a0ec8c5b..bb0c16def6 100644 --- a/testsuites/sptests/spscheduler01/init.c +++ b/testsuites/sptests/spscheduler01/init.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 embedded brains GmbH. All rights reserved. + * Copyright (c) 2014, 2016 embedded brains GmbH. All rights reserved. * * embedded brains GmbH * Dornierstr. 4 @@ -31,6 +31,10 @@ const char rtems_test_name[] = "SPSCHEDULER 1"; static const rtems_id invalid_id = 1; +static rtems_id master_id; + +static rtems_id sema_id; + static void test_task_get_set_affinity(void) { #if defined(__RTEMS_HAVE_SYS_CPUSET_H__) @@ -119,13 +123,66 @@ static void test_task_get_set_affinity(void) #endif /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */ } -static void task(rtems_task_argument arg) +static rtems_task_priority set_prio(rtems_id id, rtems_task_priority prio) +{ + rtems_status_code sc; + rtems_task_priority old_prio; + + old_prio = 0xffffffff; + sc = rtems_task_set_priority(id, prio, &old_prio); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + return old_prio; +} + +static void forbidden_task(rtems_task_argument arg) { (void) arg; rtems_test_assert(0); } +static void restart_task(rtems_task_argument arg) +{ + rtems_status_code sc; + + if (arg == 0) { + rtems_test_assert(set_prio(RTEMS_SELF, 3) == 2); + + rtems_task_restart(RTEMS_SELF, 1); + } else if (arg == 1) { + rtems_id scheduler_id; + + rtems_test_assert(set_prio(RTEMS_SELF, 3) == 2); + + sc = rtems_task_get_scheduler(RTEMS_SELF, &scheduler_id); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_set_scheduler(RTEMS_SELF, scheduler_id, 4); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + rtems_test_assert(set_prio(RTEMS_SELF, 3) == 4); + + rtems_task_restart(RTEMS_SELF, 2); + } else { + rtems_test_assert(set_prio(RTEMS_SELF, 3) == 4); + + rtems_task_resume(master_id); + } + + rtems_test_assert(0); +} + +static void sema_task(rtems_task_argument arg) +{ + rtems_status_code sc; + + sc = rtems_semaphore_obtain(sema_id, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + rtems_test_assert(0); +} + static void test_task_get_set_scheduler(void) { rtems_status_code sc; @@ -134,6 +191,7 @@ static void test_task_get_set_scheduler(void) rtems_id scheduler_id; rtems_id scheduler_by_name; rtems_id task_id; + rtems_id mtx_id; sc = rtems_scheduler_ident(name, &scheduler_by_name); rtems_test_assert(sc == RTEMS_SUCCESSFUL); @@ -156,13 +214,46 @@ static void test_task_get_set_scheduler(void) rtems_test_assert(scheduler_id == scheduler_by_name); - sc = rtems_task_set_scheduler(invalid_id, scheduler_id); + sc = rtems_task_set_scheduler(invalid_id, scheduler_id, 1); rtems_test_assert(sc == RTEMS_INVALID_ID); - sc = rtems_task_set_scheduler(self_id, invalid_id); + sc = rtems_task_set_scheduler(self_id, invalid_id, 1); rtems_test_assert(sc == RTEMS_INVALID_ID); - sc = rtems_task_set_scheduler(self_id, scheduler_id); + sc = rtems_task_set_scheduler(self_id, scheduler_id, UINT32_C(0x80000000)); + rtems_test_assert(sc == RTEMS_INVALID_PRIORITY); + + sc = rtems_task_set_scheduler(self_id, scheduler_id, 1); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_semaphore_create( + rtems_build_name(' ', 'M', 'T', 'X'), + 0, + RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_INHERIT_PRIORITY, + 0, + &mtx_id + ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_set_scheduler(self_id, scheduler_id, 1); + rtems_test_assert(sc == RTEMS_RESOURCE_IN_USE); + + sc = rtems_semaphore_release(mtx_id); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + rtems_test_assert(set_prio(self_id, RTEMS_CURRENT_PRIORITY) == 1); + + sc = rtems_task_set_scheduler(self_id, scheduler_id, 2); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + rtems_test_assert(set_prio(self_id, RTEMS_CURRENT_PRIORITY) == 2); + + sc = rtems_task_set_scheduler(self_id, scheduler_id, 1); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + rtems_test_assert(set_prio(self_id, RTEMS_CURRENT_PRIORITY) == 1); + + sc = rtems_semaphore_delete(mtx_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_create( @@ -181,13 +272,66 @@ static void test_task_get_set_scheduler(void) rtems_test_assert(scheduler_id == scheduler_by_name); - sc = rtems_task_set_scheduler(task_id, scheduler_id); + sc = rtems_task_set_scheduler(task_id, scheduler_id, 2); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_start(task_id, forbidden_task, 0); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_set_scheduler(task_id, scheduler_id, 2); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_delete(task_id); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_create( + rtems_build_name('T', 'A', 'S', 'K'), + 2, + RTEMS_MINIMUM_STACK_SIZE, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &task_id + ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); - sc = rtems_task_start(task_id, task, 0); + sc = rtems_task_start(task_id, restart_task, 0); rtems_test_assert(sc == RTEMS_SUCCESSFUL); - sc = rtems_task_set_scheduler(task_id, scheduler_id); + sc = rtems_task_suspend(self_id); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_delete(task_id); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_semaphore_create( + rtems_build_name('S', 'E', 'M', 'A'), + 0, + RTEMS_COUNTING_SEMAPHORE, + 0, + &sema_id + ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_create( + rtems_build_name('T', 'A', 'S', 'K'), + 1, + RTEMS_MINIMUM_STACK_SIZE, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &task_id + ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_start(task_id, sema_task, 0); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_wake_after(RTEMS_YIELD_PROCESSOR); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_set_scheduler(task_id, scheduler_id, 1); + rtems_test_assert(sc == RTEMS_RESOURCE_IN_USE); + + sc = rtems_semaphore_delete(sema_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_delete(task_id); @@ -275,6 +419,8 @@ static void Init(rtems_task_argument arg) rtems_resource_snapshot_take(&snapshot); + master_id = rtems_task_self(); + test_task_get_set_affinity(); test_task_get_set_scheduler(); test_scheduler_ident(); @@ -290,6 +436,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_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION |