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:
Diffstat (limited to 'winsup/testsuite/winsup.api/pthread/priority2.c')
-rw-r--r--winsup/testsuite/winsup.api/pthread/priority2.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/winsup/testsuite/winsup.api/pthread/priority2.c b/winsup/testsuite/winsup.api/pthread/priority2.c
index 0534e7ba1..f084efadf 100644
--- a/winsup/testsuite/winsup.api/pthread/priority2.c
+++ b/winsup/testsuite/winsup.api/pthread/priority2.c
@@ -54,7 +54,24 @@ void * func(void * arg)
assert(policy == SCHED_FIFO);
return (void *) (size_t)param.sched_priority;
}
-
+
+// Windows only supports 7 thread priority levels, which we map onto the 32
+// required by POSIX. The exact mapping also depends on the overall process
+// priority class. So only a subset of values will be returned exactly by
+// pthread_getschedparam() after pthread_setschedparam().
+int doable_pri(int pri)
+{
+ switch (GetPriorityClass(GetCurrentProcess()))
+ {
+ case BELOW_NORMAL_PRIORITY_CLASS:
+ return (pri == 2) || (pri == 8) || (pri == 10) || (pri == 12) || (pri == 14) || (pri == 16) || (pri == 30);
+ case NORMAL_PRIORITY_CLASS:
+ return (pri == 2) || (pri == 12) || (pri == 14) || (pri == 16) || (pri == 18) || (pri == 20) || (pri == 30);
+ }
+
+ return TRUE;
+}
+
int
main()
{
@@ -73,7 +90,8 @@ main()
assert(pthread_setschedparam(t, SCHED_FIFO, &param) == 0);
assert(pthread_mutex_unlock(&startMx) == 0);
pthread_join(t, &result);
- assert((int)(size_t)result == param.sched_priority);
+ if (doable_pri(param.sched_priority))
+ assert((int)(size_t)result == param.sched_priority);
}
return 0;