int _pthread_setprio(pthread_t pthread, int prio) { struct pthread *curthread = _get_curthread(); struct sched_param param; int ret; param.sched_priority = prio; if (pthread == curthread) THR_LOCK(curthread); else if ((ret = _thr_find_thread(curthread, pthread, /*include dead*/0))) return (ret); if (pthread->attr.sched_policy == SCHED_OTHER || pthread->attr.prio == prio) { pthread->attr.prio = prio; ret = 0; } else { ret = _thr_setscheduler(pthread->tid, pthread->attr.sched_policy, ¶m); if (ret == -1) ret = errno; else pthread->attr.prio = prio; } THR_THREAD_UNLOCK(curthread, pthread); return (ret); }
/* * Set a thread's scheduling parameters, this should be done * in kernel, doing it in userland is no-op. */ int _pthread_setschedparam(pthread_t pthread, int policy, const struct sched_param *param) { struct pthread *curthread = _get_curthread(); int ret; if (pthread == curthread) THR_LOCK(curthread); else if ((ret = _thr_find_thread(curthread, pthread, /*include dead*/0)) != 0) return (ret); if (pthread->attr.sched_policy == policy && (policy == SCHED_OTHER || pthread->attr.prio == param->sched_priority)) { pthread->attr.prio = param->sched_priority; THR_THREAD_UNLOCK(curthread, pthread); return (0); } ret = _thr_setscheduler(pthread->tid, policy, param); if (ret == -1) ret = errno; else { pthread->attr.sched_policy = policy; pthread->attr.prio = param->sched_priority; } THR_THREAD_UNLOCK(curthread, pthread); return (ret); }