Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2016-05-20 18:45:24 +0300
committerCorinna Vinschen <corinna@vinschen.de>2016-05-20 18:45:24 +0300
commit4b51e4c142445c133d6075d2a68ce98e8ec6058b (patch)
tree07f97721f626ce051addf0d7fae512e586e9c619
parent450f557feee5dd4900e3fd4f16cbb6cabe89fbc6 (diff)
Fix thread priority handling
So far pthread::postcreate() only sets the thread priority at all, only if the inherit-scheduler attribute is PTHREAD_EXPLICIT_SCHED. This completely ignores the PTHREAD_INHERIT_SCHED case, since in contrast to POSIX, a thread does not inherit its priority from the creating thread, but always starts with THREAD_PRIORITY_NORMAL. pthread_getschedparam() only returns what's stored in the thread attributes, not the actual thread priority. This patch fixes both problems. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r--winsup/cygwin/thread.cc20
1 files changed, 11 insertions, 9 deletions
diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc
index 350879ac0..1feee5b05 100644
--- a/winsup/cygwin/thread.cc
+++ b/winsup/cygwin/thread.cc
@@ -37,6 +37,7 @@ details. */
extern "C" void __fp_lock_all ();
extern "C" void __fp_unlock_all ();
extern "C" bool valid_sched_parameters(const struct sched_param *);
+extern "C" int sched_get_thread_priority(HANDLE thread);
extern "C" int sched_set_thread_priority(HANDLE thread, int priority);
static inline verifyable_object_state
verifyable_object_isvalid (void const * objectptr, thread_magic_t magic,
@@ -531,12 +532,15 @@ pthread::postcreate ()
valid = true;
InterlockedIncrement (&MT_INTERFACE->threadcount);
- /* FIXME: set the priority appropriately for system contention scope */
- if (attr.inheritsched == PTHREAD_EXPLICIT_SCHED)
- {
- /* FIXME: set the scheduling settings for the new thread */
- /* sched_thread_setparam (win32_obj_id, attr.schedparam); */
- }
+
+ /* Per POSIX the new thread inherits the sched priority from its caller
+ thread if PTHREAD_INHERIT_SCHED is set.
+ FIXME: set the priority appropriately for system contention scope */
+ if (attr.inheritsched == PTHREAD_INHERIT_SCHED)
+ attr.schedparam.sched_priority
+ = sched_get_thread_priority (GetCurrentThread ());
+ if (attr.schedparam.sched_priority)
+ sched_set_thread_priority (win32_obj_id, attr.schedparam.sched_priority);
}
void
@@ -2601,9 +2605,7 @@ pthread_getschedparam (pthread_t thread, int *policy,
if (!pthread::is_good_object (&thread))
return ESRCH;
*policy = SCHED_FIFO;
- /* we don't return the current effective priority, we return the current
- requested priority */
- *param = thread->attr.schedparam;
+ param->sched_priority = sched_get_thread_priority (thread->win32_obj_id);
return 0;
}