public inbox for cygwin-cvs@sourceware.org help / color / mirror / Atom feed
From: Jon Turney <jturney@sourceware.org> To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin] Cygwin: testsuite: Fix for limited thread priority values Date: Fri, 14 Jul 2023 15:28:23 +0000 (GMT) [thread overview] Message-ID: <20230714152823.CF00B3858C78@sourceware.org> (raw) 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;
next reply other threads:[~2023-07-14 15:28 UTC|newest] Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-07-14 15:28 Jon Turney [this message] -- strict thread matches above, loose matches on Subject: below -- 2023-07-09 16:01 Jon Turney
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20230714152823.CF00B3858C78@sourceware.org \ --to=jturney@sourceware.org \ --cc=cygwin-cvs@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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).