public inbox for cygwin-cvs@sourceware.org
help / color / mirror / Atom feed
* [newlib-cygwin] Cygwin: testsuite: Fix for limited thread priority values
@ 2023-07-14 15:28 Jon Turney
0 siblings, 0 replies; 2+ messages in thread
From: Jon Turney @ 2023-07-14 15:28 UTC (permalink / raw)
To: cygwin-cvs
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=7d50e65a8442546a6bdce7636d67ad65f154de46
commit 7d50e65a8442546a6bdce7636d67ad65f154de46
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date: Thu Sep 1 12:13:50 2022 +0100
Cygwin: testsuite: Fix for limited thread priority values
Since commit 4b51e4c1, we return the actual thread priority, not what we
originally stored in the thread attributes.
Windows only supports 7 thread priority levels, which we map onto the 32
required by POSIX. So, only a subset of values will be returned exactly
by by pthread_getschedparam() after pthread_setschedparam().
Adjust tests priority1, priority2 and inherit1 so they only check for
round-tripping priority values which can be exactly represented.
For CI, this needs to handle process priority class "below normal
priority" as well.
Also check that the range of priority values is at least 32, as required
by POSIX.
Signed-off-by: Jon Turney <jon.turney@dronecode.org.uk>
Diff:
---
winsup/testsuite/winsup.api/pthread/inherit1.c | 21 ++++++++++++++++++++-
winsup/testsuite/winsup.api/pthread/priority1.c | 24 ++++++++++++++++++++++--
winsup/testsuite/winsup.api/pthread/priority2.c | 22 ++++++++++++++++++++--
3 files changed, 62 insertions(+), 5 deletions(-)
diff --git a/winsup/testsuite/winsup.api/pthread/inherit1.c b/winsup/testsuite/winsup.api/pthread/inherit1.c
index 16c3f534b..f036462aa 100644
--- a/winsup/testsuite/winsup.api/pthread/inherit1.c
+++ b/winsup/testsuite/winsup.api/pthread/inherit1.c
@@ -50,6 +50,23 @@ void * func(void * arg)
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()
{
@@ -81,7 +98,9 @@ main()
assert(pthread_setschedparam(mainThread, SCHED_FIFO, &mainParam) == 0);
assert(pthread_getschedparam(mainThread, &policy, &mainParam) == 0);
assert(policy == SCHED_FIFO);
- assert(mainParam.sched_priority == prio);
+
+ if (doable_pri(prio))
+ assert(mainParam.sched_priority == prio);
for (param.sched_priority = prio;
param.sched_priority <= maxPrio;
diff --git a/winsup/testsuite/winsup.api/pthread/priority1.c b/winsup/testsuite/winsup.api/pthread/priority1.c
index a1e8d051d..135f77d76 100644
--- a/winsup/testsuite/winsup.api/pthread/priority1.c
+++ b/winsup/testsuite/winsup.api/pthread/priority1.c
@@ -50,7 +50,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()
{
@@ -61,6 +78,8 @@ main()
int maxPrio = sched_get_priority_max(SCHED_FIFO);
int minPrio = sched_get_priority_min(SCHED_FIFO);
+ assert((maxPrio - minPrio) >= 31);
+
assert(pthread_attr_init(&attr) == 0);
assert(pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) == 0);
@@ -71,7 +90,8 @@ main()
assert(pthread_attr_setschedparam(&attr, ¶m) == 0);
assert(pthread_create(&t, &attr, func, NULL) == 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;
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, ¶m) == 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;
^ permalink raw reply [flat|nested] 2+ messages in thread
* [newlib-cygwin] Cygwin: testsuite: Fix for limited thread priority values
@ 2023-07-09 16:01 Jon Turney
0 siblings, 0 replies; 2+ messages in thread
From: Jon Turney @ 2023-07-09 16:01 UTC (permalink / raw)
To: cygwin-cvs
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=7fcb2cd4a17bd5e07e104f8c82e403c25847c053
commit 7fcb2cd4a17bd5e07e104f8c82e403c25847c053
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date: Thu Sep 1 12:13:50 2022 +0100
Cygwin: testsuite: Fix for limited thread priority values
Windows only supports 7 thread priority levels, which we map onto the 32
required by POSIX. So, only a subset of values will be returned exactly
by by +pthread_getschedparam() after pthread_setschedparam().
Adjust tests priority1, priority2 and inherit1 so the only check for
round-tripping priority values which can be exactly represented.
Future work: Check we provide the 32 levels required by POSIX.
Diff:
---
winsup/testsuite/winsup.api/pthread/inherit1.c | 12 +++++++++++-
winsup/testsuite/winsup.api/pthread/priority1.c | 16 ++++++++++++++--
winsup/testsuite/winsup.api/pthread/priority2.c | 16 ++++++++++++++--
3 files changed, 39 insertions(+), 5 deletions(-)
diff --git a/winsup/testsuite/winsup.api/pthread/inherit1.c b/winsup/testsuite/winsup.api/pthread/inherit1.c
index 16c3f534b..e77483e89 100644
--- a/winsup/testsuite/winsup.api/pthread/inherit1.c
+++ b/winsup/testsuite/winsup.api/pthread/inherit1.c
@@ -50,6 +50,15 @@ void * func(void * arg)
return (void *) (size_t)param.sched_priority;
}
+// Windows only supports 7 thread priority levels, which we map onto the 32
+// required by POSIX. So only a subset of values will be returned exactly by by
+// pthread_getschedparam() after pthread_setschedparam().
+int doable_pri(int pri)
+{
+ return (pri == 2) || (pri == 12) || (pri == 14) || (pri == 16) || (pri == 18)
+ || (pri == 20) || (pri == 30);
+}
+
int
main()
{
@@ -81,7 +90,8 @@ main()
assert(pthread_setschedparam(mainThread, SCHED_FIFO, &mainParam) == 0);
assert(pthread_getschedparam(mainThread, &policy, &mainParam) == 0);
assert(policy == SCHED_FIFO);
- assert(mainParam.sched_priority == prio);
+ if (doable_pri(prio))
+ assert(mainParam.sched_priority == prio);
for (param.sched_priority = prio;
param.sched_priority <= maxPrio;
diff --git a/winsup/testsuite/winsup.api/pthread/priority1.c b/winsup/testsuite/winsup.api/pthread/priority1.c
index a1e8d051d..4ce3e389c 100644
--- a/winsup/testsuite/winsup.api/pthread/priority1.c
+++ b/winsup/testsuite/winsup.api/pthread/priority1.c
@@ -50,7 +50,16 @@ 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. So only a subset of values will be returned exactly by by
+// pthread_getschedparam() after pthread_setschedparam().
+int doable_pri(int pri)
+{
+ return (pri == 2) || (pri == 12) || (pri == 14) || (pri == 16) || (pri == 18)
+ || (pri == 20) || (pri == 30);
+}
+
int
main()
{
@@ -61,6 +70,8 @@ main()
int maxPrio = sched_get_priority_max(SCHED_FIFO);
int minPrio = sched_get_priority_min(SCHED_FIFO);
+ // assert((maxPrio - minPrio) >= 32);
+
assert(pthread_attr_init(&attr) == 0);
assert(pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) == 0);
@@ -71,7 +82,8 @@ main()
assert(pthread_attr_setschedparam(&attr, ¶m) == 0);
assert(pthread_create(&t, &attr, func, NULL) == 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;
diff --git a/winsup/testsuite/winsup.api/pthread/priority2.c b/winsup/testsuite/winsup.api/pthread/priority2.c
index 0534e7ba1..dec2827f8 100644
--- a/winsup/testsuite/winsup.api/pthread/priority2.c
+++ b/winsup/testsuite/winsup.api/pthread/priority2.c
@@ -54,7 +54,16 @@ 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. So only a subset of values will be returned exactly by by
+// pthread_getschedparam() after pthread_setschedparam().
+int doable_pri(int pri)
+{
+ return (pri == 2) || (pri == 12) || (pri == 14) || (pri == 16) || (pri == 18)
+ || (pri == 20) || (pri == 30);
+}
+
int
main()
{
@@ -64,6 +73,8 @@ main()
int maxPrio = sched_get_priority_max(SCHED_FIFO);
int minPrio = sched_get_priority_min(SCHED_FIFO);
+ // assert((maxPrio - minPrio) >= 32);
+
for (param.sched_priority = minPrio;
param.sched_priority <= maxPrio;
param.sched_priority++)
@@ -73,7 +84,8 @@ main()
assert(pthread_setschedparam(t, SCHED_FIFO, ¶m) == 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;
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2023-07-14 15:28 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-07-14 15:28 [newlib-cygwin] Cygwin: testsuite: Fix for limited thread priority values Jon Turney
-- strict thread matches above, loose matches on Subject: below --
2023-07-09 16:01 Jon Turney
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).