From b9850298857209b12d9b7eacdb7bfe611f2dd57a Mon Sep 17 00:00:00 2001 From: bje Date: Thu, 23 Jul 1998 15:20:22 +0000 Subject: 1998-07-24 Ben Elliston * sched.c (pthread_setschedparam): Implement. (pthread_getschedparam): Implement. (sched_get_priority_max): Validate policy argument. (sched_get_priority_min): Likewise. --- sched.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) (limited to 'sched.c') diff --git a/sched.c b/sched.c index b4cbc0d..21780c6 100644 --- a/sched.c +++ b/sched.c @@ -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; } -- cgit v1.2.3