From b9850298857209b12d9b7eacdb7bfe611f2dd57a Mon Sep 17 00:00:00 2001
From: bje <bje>
Date: Thu, 23 Jul 1998 15:20:22 +0000
Subject: 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.
---
 sched.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 74 insertions(+)

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