int main() { pthread_t t; pthread_attr_t attr; void * result = NULL; struct sched_param param; assert((maxPrio = sched_get_priority_max(SCHED_OTHER)) != -1); assert((minPrio = sched_get_priority_min(SCHED_OTHER)) != -1); assert(pthread_create(&t, NULL, getValidPriorities, NULL) == 0); assert(pthread_join(t, &result) == 0); assert(pthread_attr_init(&attr) == 0); assert(pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) == 0); /* Set the thread's priority to a known initial value. */ SetThreadPriority(pthread_getw32threadhandle_np(pthread_self()), PTW32TEST_THREAD_INIT_PRIO); for (param.sched_priority = minPrio; param.sched_priority <= maxPrio; param.sched_priority++) { assert(pthread_attr_setschedparam(&attr, ¶m) == 0); assert(pthread_create(&t, &attr, func, (void *) &attr) == 0); assert(pthread_join(t, &result) == 0); assert((int) result == validPriorities[param.sched_priority+(PTW32TEST_MAXPRIORITIES/2)]); } return 0; }
void * getValidPriorities(void * arg) { int prioSet; pthread_t threadID = pthread_self(); HANDLE threadH = pthread_getw32threadhandle_np(threadID); printf("Using GetThreadPriority\n"); printf("%10s %10s\n", "Set value", "Get value"); for (prioSet = minPrio; prioSet <= maxPrio; prioSet++) { /* * If prioSet is invalid then the threads priority is unchanged * from the previous value. Make the previous value a known * one so that we can check later. */ if (prioSet < 0) SetThreadPriority(threadH, THREAD_PRIORITY_LOWEST); else SetThreadPriority(threadH, THREAD_PRIORITY_HIGHEST); SetThreadPriority(threadH, prioSet); validPriorities[prioSet+(PTW32TEST_MAXPRIORITIES/2)] = GetThreadPriority(threadH); printf("%10d %10d\n", prioSet, validPriorities[prioSet+(PTW32TEST_MAXPRIORITIES/2)]); } return (void *) 0; }
int test_inherit1(void) #endif { pthread_t t; pthread_t mainThread = pthread_self(); pthread_attr_t attr; void * result = NULL; struct sched_param param; struct sched_param mainParam; int prio; int policy; int inheritsched = -1; pthread_t threadID = pthread_self(); HANDLE threadH = pthread_getw32threadhandle_np(threadID); assert((maxPrio = sched_get_priority_max(SCHED_OTHER)) != -1); assert((minPrio = sched_get_priority_min(SCHED_OTHER)) != -1); assert(pthread_create(&t, NULL, getValidPriorities, NULL) == 0); assert(pthread_join(t, &result) == 0); assert(pthread_attr_init(&attr) == 0); assert(pthread_attr_setinheritsched(&attr, PTHREAD_INHERIT_SCHED) == 0); assert(pthread_attr_getinheritsched(&attr, &inheritsched) == 0); assert(inheritsched == PTHREAD_INHERIT_SCHED); for (prio = minPrio; prio <= maxPrio; prio++) { mainParam.sched_priority = prio; /* Set the thread's priority to a known initial value. */ SetThreadPriority(threadH, PTW32TEST_THREAD_INIT_PRIO); /* Change the main thread priority */ assert(pthread_setschedparam(mainThread, SCHED_OTHER, &mainParam) == 0); assert(pthread_getschedparam(mainThread, &policy, &mainParam) == 0); assert(policy == SCHED_OTHER); /* Priority returned below should be the level set by pthread_setschedparam(). */ assert(mainParam.sched_priority == prio); assert(GetThreadPriority(threadH) == validPriorities[prio+(PTW32TEST_MAXPRIORITIES/2)]); for (param.sched_priority = prio; param.sched_priority <= maxPrio; param.sched_priority++) { /* The new thread create should ignore this new priority */ assert(pthread_attr_setschedparam(&attr, ¶m) == 0); assert(pthread_create(&t, &attr, func, NULL) == 0); pthread_join(t, &result); assert((int)(size_t) result == mainParam.sched_priority); } } return 0; }
int test_priority2(void) #endif { pthread_t t; void * result = NULL; int result2; struct sched_param param; assert((maxPrio = sched_get_priority_max(SCHED_OTHER)) != -1); assert((minPrio = sched_get_priority_min(SCHED_OTHER)) != -1); assert(pthread_create(&t, NULL, getValidPriorities, NULL) == 0); assert(pthread_join(t, &result) == 0); assert(pthread_barrier_init(&startBarrier, NULL, 2) == 0); assert(pthread_barrier_init(&endBarrier, NULL, 2) == 0); /* Set the thread's priority to a known initial value. * If the new priority is invalid then the threads priority * is unchanged from the previous value. */ SetThreadPriority(pthread_getw32threadhandle_np(pthread_self()), PTW32TEST_THREAD_INIT_PRIO); for (param.sched_priority = minPrio; param.sched_priority <= maxPrio; param.sched_priority++) { assert(pthread_create(&t, NULL, func, NULL) == 0); assert(pthread_setschedparam(t, SCHED_OTHER, ¶m) == 0); result2 = pthread_barrier_wait(&startBarrier); assert(result2 == 0 || result2 == PTHREAD_BARRIER_SERIAL_THREAD); result2 = pthread_barrier_wait(&endBarrier); assert(result2 == 0 || result2 == PTHREAD_BARRIER_SERIAL_THREAD); assert(GetThreadPriority(pthread_getw32threadhandle_np(t)) == validPriorities[param.sched_priority+(PTW32TEST_MAXPRIORITIES/2)]); pthread_join(t, &result); assert(param.sched_priority == (int)(size_t)result); } return 0; }
static inline PlatformThread getCurrentPlatformThread() { #if OS(DARWIN) return pthread_mach_thread_np(pthread_self()); #elif OS(WINDOWS) return pthread_getw32threadhandle_np(pthread_self()); #elif USE(PTHREADS) return pthread_self(); #endif }
void * getValidPriorities(void * arg) { int prioSet; pthread_t threadID = pthread_self(); HANDLE threadH = pthread_getw32threadhandle_np(threadID); for (prioSet = minPrio; prioSet <= maxPrio; prioSet++) { /* * If prioSet is invalid then the threads priority is unchanged * from the previous value. Make the previous value a known * one so that we can check later. */ SetThreadPriority(threadH, PTW32TEST_THREAD_INIT_PRIO); SetThreadPriority(threadH, prioSet); validPriorities[prioSet+(PTW32TEST_MAXPRIORITIES/2)] = GetThreadPriority(threadH); } return (void *) 0; }
static void * getValidPriorities(void * arg) { int prioSet; pthread_t thread = pthread_self(); HANDLE threadH = pthread_getw32threadhandle_np(thread); struct sched_param param; for (prioSet = minPrio; prioSet <= maxPrio; prioSet++) { /* * If prioSet is invalid then the threads priority is unchanged * from the previous value. Make the previous value a known * one so that we can check later. */ param.sched_priority = prioSet; assert(pthread_setschedparam(thread, SCHED_OTHER, ¶m) == 0); validPriorities[prioSet+(PTW32TEST_MAXPRIORITIES/2)] = GetThreadPriority(threadH); } return (void *) 0; }