/*! Change thread scheduling parameters ------------------------------------- */ int kthread_setschedparam (kthread_t *kthread, int policy, sched_param_t *param) { int sched_priority; ASSERT_ERRNO_AND_EXIT ( kthread, EINVAL ); ASSERT_ERRNO_AND_EXIT ( kthread_is_alive (kthread), ESRCH ); ASSERT_ERRNO_AND_EXIT ( policy >= 0 && policy < SCHED_NUM, EINVAL ); if ( param ) { ASSERT_ERRNO_AND_EXIT ( param->sched_priority >= THREAD_MIN_PRIO && param->sched_priority <= THREAD_MAX_PRIO, EINVAL ); if ( param->sched_priority ) sched_priority = param->sched_priority; else sched_priority = kthread->sched_priority; } else { sched_priority = kthread->sched_priority; } /* change in priority? */ if ( kthread->sched_priority != sched_priority ) kthread_set_prio ( kthread, sched_priority ); return EXIT_SUCCESS; }
/*! Change thread scheduling parameters ------------------------------------- */ int kthread_setschedparam (kthread_t *kthread, int policy, sched_param_t *param) { int sched_priority; sched_supp_t *supp; ASSERT_AND_RETURN_ERRNO ( kthread, EINVAL ); ASSERT_AND_RETURN_ERRNO ( kthread_is_alive (kthread), ESRCH ); ASSERT_AND_RETURN_ERRNO ( policy >= 0 && policy < SCHED_NUM, EINVAL ); if ( param ) { ASSERT_AND_RETURN_ERRNO ( param->sched_priority >= THREAD_MIN_PRIO && param->sched_priority <= THREAD_MAX_PRIO, EINVAL ); if ( param->sched_priority ) sched_priority = param->sched_priority; else sched_priority = kthread->sched_priority; supp = ¶m->supp; } else { sched_priority = kthread->sched_priority; supp = NULL; } /* change in priority? */ if ( kthread->sched_priority != sched_priority ) kthread_set_prio ( kthread, sched_priority ); /* change in scheduling policy? */ if ( kthread->sched_policy != policy ) { ksched2_thread_remove ( kthread ); ksched2_schedule ( kthread->sched_policy ); kthread->sched_policy = policy; ksched2_thread_add ( kthread, policy, sched_priority, supp ); ksched2_schedule ( kthread->sched_policy ); } else if ( supp ) /* if policy changed, parameters are already given */ { ksched2_setsched_param ( kthread, supp ); } return EXIT_SUCCESS; }