diff options
Diffstat (limited to '')
-rw-r--r-- | cpukit/rtems/include/rtems/rtems/tasks.h | 23 | ||||
-rw-r--r-- | cpukit/rtems/src/tasksetscheduler.c | 21 |
2 files changed, 31 insertions, 13 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 ); } |