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>
This commit is contained in:
parent
450f557fee
commit
4b51e4c142
@ -37,6 +37,7 @@ details. */
|
|||||||
extern "C" void __fp_lock_all ();
|
extern "C" void __fp_lock_all ();
|
||||||
extern "C" void __fp_unlock_all ();
|
extern "C" void __fp_unlock_all ();
|
||||||
extern "C" bool valid_sched_parameters(const struct sched_param *);
|
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);
|
extern "C" int sched_set_thread_priority(HANDLE thread, int priority);
|
||||||
static inline verifyable_object_state
|
static inline verifyable_object_state
|
||||||
verifyable_object_isvalid (void const * objectptr, thread_magic_t magic,
|
verifyable_object_isvalid (void const * objectptr, thread_magic_t magic,
|
||||||
@ -531,12 +532,15 @@ pthread::postcreate ()
|
|||||||
valid = true;
|
valid = true;
|
||||||
|
|
||||||
InterlockedIncrement (&MT_INTERFACE->threadcount);
|
InterlockedIncrement (&MT_INTERFACE->threadcount);
|
||||||
/* FIXME: set the priority appropriately for system contention scope */
|
|
||||||
if (attr.inheritsched == PTHREAD_EXPLICIT_SCHED)
|
/* Per POSIX the new thread inherits the sched priority from its caller
|
||||||
{
|
thread if PTHREAD_INHERIT_SCHED is set.
|
||||||
/* FIXME: set the scheduling settings for the new thread */
|
FIXME: set the priority appropriately for system contention scope */
|
||||||
/* sched_thread_setparam (win32_obj_id, attr.schedparam); */
|
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
|
void
|
||||||
@ -2601,9 +2605,7 @@ pthread_getschedparam (pthread_t thread, int *policy,
|
|||||||
if (!pthread::is_good_object (&thread))
|
if (!pthread::is_good_object (&thread))
|
||||||
return ESRCH;
|
return ESRCH;
|
||||||
*policy = SCHED_FIFO;
|
*policy = SCHED_FIFO;
|
||||||
/* we don't return the current effective priority, we return the current
|
param->sched_priority = sched_get_thread_priority (thread->win32_obj_id);
|
||||||
requested priority */
|
|
||||||
*param = thread->attr.schedparam;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user