summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cpukit/rtems/include/rtems/rtems/tasks.h23
-rw-r--r--cpukit/rtems/src/tasksetscheduler.c21
-rw-r--r--cpukit/score/include/rtems/score/schedulerimpl.h101
-rw-r--r--cpukit/score/include/rtems/score/status.h2
-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
13 files changed, 306 insertions, 102 deletions
diff --git a/cpukit/rtems/include/rtems/rtems/tasks.h b/cpukit/rtems/include/rtems/rtems/tasks.h
index 6273228f85..e690e60557 100644
--- a/cpukit/rtems/include/rtems/rtems/tasks.h
+++ b/cpukit/rtems/include/rtems/rtems/tasks.h
@@ -448,23 +448,32 @@ rtems_status_code rtems_task_get_scheduler(
);
/**
- * @brief Sets the scheduler of a task.
+ * @brief Sets the scheduler instance of a task.
*
- * The scheduler of a task is initialized to the scheduler of the task that
- * created it.
+ * Initially, the scheduler instance of a task is set to the scheduler instance
+ * of the task that created it. This directive allows to move a task from its
+ * current scheduler instance to another specified by the scheduler identifier.
*
* @param[in] task_id Identifier of the task. Use @ref RTEMS_SELF to select
- * the executing task.
- * @param[in] scheduler_id Identifier of the scheduler.
+ * the executing task.
+ * @param[in] scheduler_id Identifier of the scheduler instance.
+ * @param[in] priority The task priority with respect to the new scheduler
+ * instance. The real and initial priority of the task is set to this value.
+ * The initial priority is used by rtems_task_restart() for example.
*
* @retval RTEMS_SUCCESSFUL Successful operation.
+ * @retval RTEMS_ILLEGAL_ON_REMOTE_OBJECT Directive is illegal on remote tasks.
* @retval RTEMS_INVALID_ID Invalid task or scheduler identifier.
+ * @retval RTEMS_INVALID_PRIORITY Invalid priority.
+ * @retval RTEMS_RESOURCE_IN_USE The task owns resources which deny a scheduler
+ * change.
*
* @see rtems_scheduler_ident().
*/
rtems_status_code rtems_task_set_scheduler(
- rtems_id task_id,
- rtems_id scheduler_id
+ rtems_id task_id,
+ rtems_id scheduler_id,
+ rtems_task_priority priority
);
/**
diff --git a/cpukit/rtems/src/tasksetscheduler.c b/cpukit/rtems/src/tasksetscheduler.c
index 36fb46d629..175f235f02 100644
--- a/cpukit/rtems/src/tasksetscheduler.c
+++ b/cpukit/rtems/src/tasksetscheduler.c
@@ -16,12 +16,14 @@
#include "config.h"
#endif
-#include <rtems/rtems/tasks.h>
+#include <rtems/rtems/tasksimpl.h>
+#include <rtems/rtems/statusimpl.h>
#include <rtems/score/schedulerimpl.h>
rtems_status_code rtems_task_set_scheduler(
- rtems_id task_id,
- rtems_id scheduler_id
+ rtems_id task_id,
+ rtems_id scheduler_id,
+ rtems_task_priority priority
)
{
const Scheduler_Control *scheduler;
@@ -30,12 +32,19 @@ rtems_status_code rtems_task_set_scheduler(
ISR_lock_Context state_lock_context;
Per_CPU_Control *cpu_self;
void *lock;
- bool ok;
+ bool valid;
+ Priority_Control core_priority;
+ Status_Control status;
if ( !_Scheduler_Get_by_id( scheduler_id, &scheduler ) ) {
return RTEMS_INVALID_ID;
}
+ core_priority = _RTEMS_Priority_To_core( scheduler, priority, &valid );
+ if ( !valid ) {
+ return RTEMS_INVALID_PRIORITY;
+ }
+
the_thread = _Thread_Get( task_id, &lock_context );
if ( the_thread == NULL ) {
@@ -54,10 +63,10 @@ rtems_status_code rtems_task_set_scheduler(
lock = _Thread_Lock_acquire( the_thread, &lock_context );
_Thread_State_acquire_critical( the_thread, &state_lock_context );
- ok = _Scheduler_Set( scheduler, the_thread );
+ status = _Scheduler_Set( scheduler, the_thread, core_priority );
_Thread_State_release_critical( the_thread, &state_lock_context );
_Thread_Lock_release( lock, &lock_context );
_Thread_Dispatch_enable( cpu_self );
- return ok ? RTEMS_SUCCESSFUL : RTEMS_INCORRECT_STATE;
+ return _Status_Get( status );
}
diff --git a/cpukit/score/include/rtems/score/schedulerimpl.h b/cpukit/score/include/rtems/score/schedulerimpl.h
index 9885adf210..2007b30b9d 100644
--- a/cpukit/score/include/rtems/score/schedulerimpl.h
+++ b/cpukit/score/include/rtems/score/schedulerimpl.h
@@ -23,6 +23,7 @@
#include <rtems/score/scheduler.h>
#include <rtems/score/cpusetimpl.h>
#include <rtems/score/smpimpl.h>
+#include <rtems/score/status.h>
#include <rtems/score/threadimpl.h>
#ifdef __cplusplus
@@ -580,51 +581,6 @@ RTEMS_INLINE_ROUTINE bool _Scheduler_Has_processor_ownership(
#endif
}
-RTEMS_INLINE_ROUTINE bool _Scheduler_Set(
- const Scheduler_Control *scheduler,
- Thread_Control *the_thread
-)
-{
-#if defined(RTEMS_SMP)
- const Scheduler_Control *current_scheduler;
- States_Control current_state;
-
- current_scheduler = _Scheduler_Get( the_thread );
-
- if ( current_scheduler == scheduler ) {
- return true;
- }
-
- if ( _Thread_Owns_resources( the_thread ) ) {
- return false;
- }
-
- current_state = the_thread->current_state;
-
- if ( _States_Is_ready( current_state ) ) {
- _Scheduler_Block( the_thread );
- }
-
- _Scheduler_Node_destroy( current_scheduler, the_thread );
- the_thread->Scheduler.own_control = scheduler;
- the_thread->Scheduler.control = scheduler;
- _Scheduler_Node_initialize(
- scheduler,
- the_thread,
- the_thread->current_priority
- );
-
- if ( _States_Is_ready( current_state ) ) {
- _Scheduler_Unblock( the_thread );
- }
-
- return true;
-#else
- (void) scheduler;
- return true;
-#endif
-}
-
#if defined(__RTEMS_HAVE_SYS_CPUSET_H__)
RTEMS_INLINE_ROUTINE void _Scheduler_Get_processor_set(
@@ -1472,6 +1428,61 @@ RTEMS_INLINE_ROUTINE void _Scheduler_Update_heir(
}
}
+RTEMS_INLINE_ROUTINE Status_Control _Scheduler_Set(
+ const Scheduler_Control *new_scheduler,
+ Thread_Control *the_thread,
+ Priority_Control priority
+)
+{
+ Scheduler_Node *own_node;
+
+ if (
+ _Thread_Owns_resources( the_thread )
+ || the_thread->Wait.queue != NULL
+ ) {
+ return STATUS_RESOURCE_IN_USE;
+ }
+
+ the_thread->current_priority = priority;
+ the_thread->real_priority = priority;
+ the_thread->Start.initial_priority = priority;
+
+ own_node = _Scheduler_Thread_get_own_node( the_thread );
+
+#if defined(RTEMS_SMP)
+ {
+ const Scheduler_Control *old_scheduler;
+
+ old_scheduler = _Scheduler_Get( the_thread );
+
+ if ( old_scheduler != new_scheduler ) {
+ States_Control current_state;
+
+ current_state = the_thread->current_state;
+
+ if ( _States_Is_ready( current_state ) ) {
+ _Scheduler_Block( the_thread );
+ }
+
+ _Scheduler_Node_destroy( old_scheduler, the_thread );
+ the_thread->Scheduler.own_control = new_scheduler;
+ the_thread->Scheduler.control = new_scheduler;
+ _Scheduler_Node_initialize( new_scheduler, the_thread, priority );
+
+ if ( _States_Is_ready( current_state ) ) {
+ _Scheduler_Unblock( the_thread );
+ }
+
+ return STATUS_SUCCESSFUL;
+ }
+ }
+#endif
+
+ _Scheduler_Node_set_priority( own_node, priority, false );
+ _Scheduler_Update_priority( the_thread );
+ return STATUS_SUCCESSFUL;
+}
+
/** @} */
#ifdef __cplusplus
diff --git a/cpukit/score/include/rtems/score/status.h b/cpukit/score/include/rtems/score/status.h
index d30f731a70..a4b2de9d26 100644
--- a/cpukit/score/include/rtems/score/status.h
+++ b/cpukit/score/include/rtems/score/status.h
@@ -83,6 +83,8 @@ typedef enum {
STATUS_BUILD( STATUS_CLASSIC_INCORRECT_STATE, EDEADLK ),
STATUS_FLUSHED =
STATUS_BUILD( STATUS_CLASSIC_UNSATISFIED, EAGAIN ),
+ STATUS_INCORRECT_STATE =
+ STATUS_BUILD( STATUS_CLASSIC_INCORRECT_STATE, EINVAL ),
STATUS_INTERRUPTED =
STATUS_BUILD( STATUS_CLASSIC_INTERNAL_ERROR, EINTR ),
STATUS_INVALID_NUMBER =
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