diff options
author | bje <bje> | 1998-07-23 15:20:22 +0000 |
---|---|---|
committer | bje <bje> | 1998-07-23 15:20:22 +0000 |
commit | b9850298857209b12d9b7eacdb7bfe611f2dd57a (patch) | |
tree | 3b9ebe5ea427f29af38438de8fa49e9ad6597739 | |
parent | 36dfdefb2c77879ceeef04e0b1094e5498b81b46 (diff) |
1998-07-24 Ben Elliston <bje@cygnus.com>
* sched.c (pthread_setschedparam): Implement.
(pthread_getschedparam): Implement.
(sched_get_priority_max): Validate policy argument.
(sched_get_priority_min): Likewise.
-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; } |