diff options
-rw-r--r-- | sched.c | 74 |
1 files changed, 74 insertions, 0 deletions
@@ -32,14 +32,88 @@ int pthread_attr_getschedparam(const pthread_attr_t *attr, return 0; } +int pthread_setschedparam(pthread_t thread, int policy, + const struct sched_param *param) +{ + /* Validate the thread id. */ + if (_pthread_find_thread_entry(thread) < 0) + { + return EINVAL; + } + + /* Validate the scheduling policy. */ + if (policy < SCHED_MIN || policy > SCHED_MAX) + { + return EINVAL; + } + + /* Ensure the policy is SCHED_OTHER. */ + if (policy != SCHED_OTHER) + { + return ENOSUP; + } + + /* Validate priority level. */ + if (param->sched_policy < sched_get_priority_min(policy) || + param->sched_policy > sched_get_priority_max(policy)) + { + return EINVAL; + } + + /* This is practically guaranteed to return TRUE. */ + (void) SetThreadPriority(thread, param->sched_policy); + return 0; +} + +int pthread_getschedparam(pthread_t thread, int *policy, + struct sched_param *param) +{ + int prio; + + /* Validate the thread id. */ + if (_pthread_find_thread_entry(thread) < 0) + { + return EINVAL; + } + + /* Validate the param structure. */ + if (param == NULL) + { + return EINVAL; + } + + /* Fill out the policy. */ + *policy = SCHED_OTHER; + + /* Fill out the sched_param structure. */ + prio = GetThreadPriority(thread); + if (prio == THREAD_PRIORITY_ERROR_RETURN) + { + return EINVAL; + } + + param->sched_policy = prio; + return 0; +} + int sched_get_priority_max(int policy) { + if (policy < SCHED_MIN || policy > SCHED_MAX) + { + return EINVAL; + } + /* This is independent of scheduling policy in Win32. */ return THREAD_PRIORITY_HIGHEST; } int sched_get_priority_min(int policy) { + if (policy < SCHED_MIN || policy > SCHED_MAX) + { + return EINVAL; + } + /* This is independent of scheduling policy in Win32. */ return THREAD_PRIORITY_LOWEST; } |