summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sched.c74
1 files changed, 74 insertions, 0 deletions
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;
}