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_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; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue