summaryrefslogtreecommitdiffstats
path: root/testsuites
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-06-30 14:08:18 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-07-01 11:51:49 +0200
commitc0bd0064ac41f0602c0abfe494dbe140d7c5282f (patch)
treeaaa200033234cf2d3833305f13565171521b0d26 /testsuites
parentscore: Workaround for #2751 (diff)
downloadrtems-c0bd0064ac41f0602c0abfe494dbe140d7c5282f.tar.bz2
rtems: Fix rtems_task_set_scheduler() API
Task priorities are only valid within a scheduler instance. The rtems_task_set_scheduler() directive moves a task from one scheduler instance to another using the current priority of the thread. However, the current task priority of the source scheduler instance is undefined in the target scheduler instance. Add a third parameter to specify the priority. Close #2749.
Diffstat (limited to 'testsuites')
-rw-r--r--testsuites/smptests/smpclock01/init.c4
-rw-r--r--testsuites/smptests/smpmigration02/init.c35
-rw-r--r--testsuites/smptests/smpmrsp01/init.c37
-rw-r--r--testsuites/smptests/smpmutex01/init.c2
-rw-r--r--testsuites/smptests/smppsxmutex01/init.c6
-rw-r--r--testsuites/smptests/smpscheduler02/init.c6
-rw-r--r--testsuites/smptests/smpscheduler03/init.c4
-rw-r--r--testsuites/smptests/smpwakeafter01/init.c4
-rw-r--r--testsuites/sptests/spscheduler01/init.c163
9 files changed, 217 insertions, 44 deletions
diff --git a/testsuites/smptests/smpclock01/init.c b/testsuites/smptests/smpclock01/init.c
index 36016ef680..ec98e2e33e 100644
--- a/testsuites/smptests/smpclock01/init.c
+++ b/testsuites/smptests/smpclock01/init.c
@@ -133,7 +133,7 @@ static void test(void)
sc = rtems_task_create(
SCHEDULER_B,
- 1,
+ 255,
RTEMS_MINIMUM_STACK_SIZE,
RTEMS_DEFAULT_MODES,
RTEMS_DEFAULT_ATTRIBUTES,
@@ -141,7 +141,7 @@ static void test(void)
);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
- sc = rtems_task_set_scheduler(task_id, scheduler_b_id);
+ sc = rtems_task_set_scheduler(task_id, scheduler_b_id, 1);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
sc = rtems_task_start(task_id, timer_task, (rtems_task_argument) ctx);
diff --git a/testsuites/smptests/smpmigration02/init.c b/testsuites/smptests/smpmigration02/init.c
index 3af8283518..193d5992e7 100644
--- a/testsuites/smptests/smpmigration02/init.c
+++ b/testsuites/smptests/smpmigration02/init.c
@@ -46,20 +46,32 @@ typedef struct {
static test_context test_instance;
+static rtems_task_priority migration_task_prio(uint32_t task_index)
+{
+ return task_index > 0 ? PRIO_LOW : PRIO_HIGH;
+}
+
static void migration_task(rtems_task_argument arg)
{
test_context *ctx = &test_instance;
- rtems_status_code sc;
+ uint32_t task_index = arg;
+ rtems_task_priority prio = migration_task_prio(task_index);
uint32_t cpu_count = rtems_get_processor_count();
uint32_t cpu_index = rtems_get_current_processor();
while (true) {
+ rtems_status_code sc;
+
cpu_index = (cpu_index + 1) % cpu_count;
- sc = rtems_task_set_scheduler(RTEMS_SELF, ctx->scheduler_ids[cpu_index]);
+ sc = rtems_task_set_scheduler(
+ RTEMS_SELF,
+ ctx->scheduler_ids[cpu_index],
+ prio
+ );
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
- ++ctx->counters[arg].value;
+ ++ctx->counters[task_index].value;
rtems_test_assert(cpu_index == rtems_get_current_processor());
}
@@ -77,7 +89,7 @@ static void test_migrations(test_context *ctx)
sc = rtems_task_create(
rtems_build_name('T', 'A', 'S', 'K'),
- task_index > 0 ? PRIO_LOW : PRIO_HIGH,
+ 255,
RTEMS_MINIMUM_STACK_SIZE,
RTEMS_DEFAULT_MODES,
RTEMS_DEFAULT_ATTRIBUTES,
@@ -85,7 +97,11 @@ static void test_migrations(test_context *ctx)
);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
- sc = rtems_task_set_scheduler(task_id, ctx->scheduler_ids[task_index % cpu_count]);
+ sc = rtems_task_set_scheduler(
+ task_id,
+ ctx->scheduler_ids[task_index % cpu_count],
+ migration_task_prio(task_index)
+ );
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
sc = rtems_task_start(task_id, migration_task, task_index);
@@ -163,7 +179,8 @@ static void test_double_migration(test_context *ctx)
sc = rtems_task_set_scheduler(
task_id,
- ctx->scheduler_ids[cpu_other_index]
+ ctx->scheduler_ids[cpu_other_index],
+ 2
);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
@@ -189,7 +206,8 @@ static void test_double_migration(test_context *ctx)
sc = rtems_task_set_scheduler(
RTEMS_SELF,
- ctx->scheduler_ids[cpu_other_index]
+ ctx->scheduler_ids[cpu_other_index],
+ 1
);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
@@ -207,7 +225,8 @@ static void test_double_migration(test_context *ctx)
sc = rtems_task_set_scheduler(
RTEMS_SELF,
- ctx->scheduler_ids[cpu_self_index]
+ ctx->scheduler_ids[cpu_self_index],
+ 1
);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
diff --git a/testsuites/smptests/smpmrsp01/init.c b/testsuites/smptests/smpmrsp01/init.c
index 30fb5772b8..efc997a268 100644
--- a/testsuites/smptests/smpmrsp01/init.c
+++ b/testsuites/smptests/smpmrsp01/init.c
@@ -418,7 +418,7 @@ static void test_mrsp_obtain_and_release(test_context *ctx)
sc = rtems_task_create(
rtems_build_name('W', 'O', 'R', 'K'),
- 4,
+ 255,
RTEMS_MINIMUM_STACK_SIZE,
RTEMS_DEFAULT_MODES,
RTEMS_DEFAULT_ATTRIBUTES,
@@ -426,7 +426,7 @@ static void test_mrsp_obtain_and_release(test_context *ctx)
);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
- sc = rtems_task_set_scheduler(ctx->worker_ids[0], ctx->scheduler_ids[1]);
+ sc = rtems_task_set_scheduler(ctx->worker_ids[0], ctx->scheduler_ids[1], 4);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
sc = rtems_task_start(ctx->worker_ids[0], obtain_and_release_worker, 0);
@@ -575,7 +575,7 @@ static void test_mrsp_obtain_after_migration(test_context *ctx)
sc = rtems_task_create(
rtems_build_name('W', 'O', 'R', 'K'),
- 3,
+ 255,
RTEMS_MINIMUM_STACK_SIZE,
RTEMS_DEFAULT_MODES,
RTEMS_DEFAULT_ATTRIBUTES,
@@ -583,7 +583,7 @@ static void test_mrsp_obtain_after_migration(test_context *ctx)
);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
- sc = rtems_task_set_scheduler(ctx->worker_ids[0], ctx->scheduler_ids[1]);
+ sc = rtems_task_set_scheduler(ctx->worker_ids[0], ctx->scheduler_ids[1], 3);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
/* Create a MrsP semaphore objects */
@@ -1152,7 +1152,7 @@ static void start_low_task(test_context *ctx, size_t i)
sc = rtems_task_create(
rtems_build_name('L', 'O', 'W', '0' + i),
- 5,
+ 255,
RTEMS_MINIMUM_STACK_SIZE,
RTEMS_DEFAULT_MODES,
RTEMS_DEFAULT_ATTRIBUTES,
@@ -1160,7 +1160,7 @@ static void start_low_task(test_context *ctx, size_t i)
);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
- sc = rtems_task_set_scheduler(ctx->low_task_id[i], ctx->scheduler_ids[i]);
+ sc = rtems_task_set_scheduler(ctx->low_task_id[i], ctx->scheduler_ids[i], 5);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
sc = rtems_task_start(
@@ -1202,7 +1202,7 @@ static void test_mrsp_various_block_and_unblock(test_context *ctx)
sc = rtems_task_create(
rtems_build_name('H', 'I', 'G', '1'),
- 2,
+ 255,
RTEMS_MINIMUM_STACK_SIZE,
RTEMS_DEFAULT_MODES,
RTEMS_DEFAULT_ATTRIBUTES,
@@ -1210,12 +1210,12 @@ static void test_mrsp_various_block_and_unblock(test_context *ctx)
);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
- sc = rtems_task_set_scheduler(ctx->high_task_id[1], ctx->scheduler_ids[1]);
+ sc = rtems_task_set_scheduler(ctx->high_task_id[1], ctx->scheduler_ids[1], 2);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
sc = rtems_task_create(
rtems_build_name('W', 'O', 'R', 'K'),
- 4,
+ 255,
RTEMS_MINIMUM_STACK_SIZE,
RTEMS_DEFAULT_MODES,
RTEMS_DEFAULT_ATTRIBUTES,
@@ -1223,7 +1223,7 @@ static void test_mrsp_various_block_and_unblock(test_context *ctx)
);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
- sc = rtems_task_set_scheduler(ctx->worker_ids[0], ctx->scheduler_ids[1]);
+ sc = rtems_task_set_scheduler(ctx->worker_ids[0], ctx->scheduler_ids[1], 4);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
sc = rtems_task_start(ctx->worker_ids[0], ready_unlock_worker, 0);
@@ -1365,7 +1365,7 @@ static void test_mrsp_obtain_and_release_with_help(test_context *ctx)
sc = rtems_task_create(
rtems_build_name('H', 'E', 'L', 'P'),
- 3,
+ 255,
RTEMS_MINIMUM_STACK_SIZE,
RTEMS_DEFAULT_MODES,
RTEMS_DEFAULT_ATTRIBUTES,
@@ -1375,7 +1375,8 @@ static void test_mrsp_obtain_and_release_with_help(test_context *ctx)
sc = rtems_task_set_scheduler(
help_task_id,
- ctx->scheduler_ids[1]
+ ctx->scheduler_ids[1],
+ 3
);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
@@ -1549,7 +1550,7 @@ static void migration_task(rtems_task_argument arg)
while (true) {
uint32_t cpu_index = (v >> 5) % cpu_count;
- sc = rtems_task_set_scheduler(RTEMS_SELF, ctx->scheduler_ids[cpu_index]);
+ sc = rtems_task_set_scheduler(RTEMS_SELF, ctx->scheduler_ids[cpu_index], 2);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
++ctx->migration_counters[rtems_get_current_processor()];
@@ -1600,7 +1601,7 @@ static void test_mrsp_load(test_context *ctx)
sc = rtems_task_create(
'A' + a,
- 3 + MRSP_COUNT + a,
+ 255,
RTEMS_MINIMUM_STACK_SIZE,
RTEMS_DEFAULT_MODES,
RTEMS_DEFAULT_ATTRIBUTES,
@@ -1610,7 +1611,8 @@ static void test_mrsp_load(test_context *ctx)
sc = rtems_task_set_scheduler(
ctx->worker_ids[a],
- ctx->scheduler_ids[index]
+ ctx->scheduler_ids[index],
+ 3 + MRSP_COUNT + a
);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
@@ -1623,7 +1625,7 @@ static void test_mrsp_load(test_context *ctx)
sc = rtems_task_create(
'A' + b,
- 3 + MRSP_COUNT + b,
+ 255,
RTEMS_MINIMUM_STACK_SIZE,
RTEMS_DEFAULT_MODES,
RTEMS_DEFAULT_ATTRIBUTES,
@@ -1633,7 +1635,8 @@ static void test_mrsp_load(test_context *ctx)
sc = rtems_task_set_scheduler(
ctx->worker_ids[b],
- ctx->scheduler_ids[index]
+ ctx->scheduler_ids[index],
+ 3 + MRSP_COUNT + b
);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
diff --git a/testsuites/smptests/smpmutex01/init.c b/testsuites/smptests/smpmutex01/init.c
index b1381725ea..5adc2e2244 100644
--- a/testsuites/smptests/smpmutex01/init.c
+++ b/testsuites/smptests/smpmutex01/init.c
@@ -81,7 +81,7 @@ static void start_task(
sc = rtems_scheduler_ident(scheduler, &scheduler_id);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
- sc = rtems_task_set_scheduler(ctx->tasks[id], scheduler_id);
+ sc = rtems_task_set_scheduler(ctx->tasks[id], scheduler_id, prio);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
sc = rtems_task_start(ctx->tasks[id], entry, id);
diff --git a/testsuites/smptests/smppsxmutex01/init.c b/testsuites/smptests/smppsxmutex01/init.c
index 761b5b9d51..1cd7be54bf 100644
--- a/testsuites/smptests/smppsxmutex01/init.c
+++ b/testsuites/smptests/smppsxmutex01/init.c
@@ -44,6 +44,7 @@ static void *thread_b(void *arg)
test_context *ctx;
rtems_id scheduler_b_id;
rtems_status_code sc;
+ rtems_task_priority prio;
int prio_ceiling;
int eno;
@@ -54,7 +55,10 @@ static void *thread_b(void *arg)
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);
+ sc = rtems_task_set_priority(pthread_self(), RTEMS_CURRENT_PRIORITY, &prio);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_task_set_scheduler(pthread_self(), scheduler_b_id, prio);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
rtems_test_assert(rtems_get_current_processor() == 1);
diff --git a/testsuites/smptests/smpscheduler02/init.c b/testsuites/smptests/smpscheduler02/init.c
index 52b3f61816..660346e316 100644
--- a/testsuites/smptests/smpscheduler02/init.c
+++ b/testsuites/smptests/smpscheduler02/init.c
@@ -165,10 +165,10 @@ static void test(void)
rtems_test_assert(sched_get_priority_max(SCHED_RR) == 254);
if (cpu_count > 1) {
- sc = rtems_task_set_scheduler(task_id, scheduler_b_id);
+ sc = rtems_task_set_scheduler(task_id, scheduler_b_id, 1);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
- sc = rtems_task_set_scheduler(task_id, scheduler_b_id + 1);
+ sc = rtems_task_set_scheduler(task_id, scheduler_b_id + 1, 1);
rtems_test_assert(sc == RTEMS_INVALID_ID);
sc = rtems_task_get_scheduler(task_id, &scheduler_id);
@@ -200,7 +200,7 @@ static void test(void)
sc = rtems_task_start(task_id, task, 0);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
- sc = rtems_task_set_scheduler(task_id, scheduler_b_id);
+ sc = rtems_task_set_scheduler(task_id, scheduler_b_id, 1);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT);
diff --git a/testsuites/smptests/smpscheduler03/init.c b/testsuites/smptests/smpscheduler03/init.c
index f610b62532..b7a76a994c 100644
--- a/testsuites/smptests/smpscheduler03/init.c
+++ b/testsuites/smptests/smpscheduler03/init.c
@@ -603,7 +603,7 @@ static void Init(rtems_task_argument arg)
sc = rtems_task_create(
rtems_build_name('T', 'A', 'S', 'K'),
- 1,
+ 255,
RTEMS_MINIMUM_STACK_SIZE,
RTEMS_DEFAULT_MODES,
RTEMS_DEFAULT_ATTRIBUTES,
@@ -614,7 +614,7 @@ static void Init(rtems_task_argument arg)
sc = rtems_scheduler_ident(SCHED_NAME(cpu_index), &scheduler_id);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
- sc = rtems_task_set_scheduler(ctx->task_id[cpu_index], scheduler_id);
+ sc = rtems_task_set_scheduler(ctx->task_id[cpu_index], scheduler_id, 1);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
sc = rtems_task_start(ctx->task_id[cpu_index], test_task, cpu_index);
diff --git a/testsuites/smptests/smpwakeafter01/init.c b/testsuites/smptests/smpwakeafter01/init.c
index e5e0305283..b82bd3f872 100644
--- a/testsuites/smptests/smpwakeafter01/init.c
+++ b/testsuites/smptests/smpwakeafter01/init.c
@@ -93,7 +93,7 @@ static void test(void)
for (j = 0; j < INTERVAL_COUNT; ++j) {
sc = rtems_task_create(
rtems_build_name('T', 'A', 'S', 'K'),
- 2,
+ 255,
RTEMS_MINIMUM_STACK_SIZE,
RTEMS_DEFAULT_MODES,
RTEMS_DEFAULT_ATTRIBUTES,
@@ -101,7 +101,7 @@ static void test(void)
);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
- sc = rtems_task_set_scheduler(task_ids[i][j], scheduler_id);
+ sc = rtems_task_set_scheduler(task_ids[i][j], scheduler_id, 2);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
sc = rtems_task_start(task_ids[i][j], task, make_arg(i, j));
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