From d0023fa3ea1e8f29e80d473ab13d8200bdd2dc3a Mon Sep 17 00:00:00 2001 From: Jon Turney Date: Sat, 15 Jul 2023 17:57:43 +0100 Subject: [PATCH] Cygwin: testsuite: Make cancel3 and cancel5 more robust Despite our efforts, sometimes the async cancellation gets deferred. Notice this by calling pthread_testcancel(), and then try to work out if async cancellation was ever successful by checking if all threads ran for the full 10 seconds, or if some were stopped early. --- winsup/testsuite/winsup.api/pthread/cancel3.c | 16 +++++++++++++++- winsup/testsuite/winsup.api/pthread/cancel5.c | 14 ++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/winsup/testsuite/winsup.api/pthread/cancel3.c b/winsup/testsuite/winsup.api/pthread/cancel3.c index 07feb7c9b..075f052cc 100644 --- a/winsup/testsuite/winsup.api/pthread/cancel3.c +++ b/winsup/testsuite/winsup.api/pthread/cancel3.c @@ -92,6 +92,9 @@ mythread(void * arg) } } + /* Notice if asynchronous cancel got deferred */ + pthread_testcancel(); + return result; } @@ -101,6 +104,7 @@ main() int failed = 0; int i; pthread_t t[NUMTHREADS + 1]; + int ran_to_completion = 0; assert((t[0] = pthread_self()) != NULL); @@ -130,7 +134,7 @@ main() * Standard check that all threads started. */ for (i = 1; i <= NUMTHREADS; i++) - { + { if (!threadbag[i].started) { failed |= !threadbag[i].started; @@ -166,9 +170,19 @@ main() threadbag[i].count, result); } + + if (threadbag[i].count >= 10) + ran_to_completion++; + failed = (failed || fail); } + if (ran_to_completion >= 10) + { + fprintf(stderr, "All threads ran to completion, async cancellation never happened\n"); + failed = TRUE; + } + assert(!failed); /* diff --git a/winsup/testsuite/winsup.api/pthread/cancel5.c b/winsup/testsuite/winsup.api/pthread/cancel5.c index 999b3c95c..23c02afe4 100644 --- a/winsup/testsuite/winsup.api/pthread/cancel5.c +++ b/winsup/testsuite/winsup.api/pthread/cancel5.c @@ -93,6 +93,9 @@ mythread(void * arg) } } + /* Notice if asynchronous cancel got deferred */ + pthread_testcancel(); + return result; } @@ -102,6 +105,7 @@ main() int failed = 0; int i; pthread_t t[NUMTHREADS + 1]; + int ran_to_completion = 0; for (i = 1; i <= NUMTHREADS; i++) { @@ -165,9 +169,19 @@ main() threadbag[i].count, result); } + + if (threadbag[i].count >= 10) + ran_to_completion++; + failed = (failed || fail); } + if (ran_to_completion >= 10) + { + fprintf(stderr, "All threads ran to completion, async cancellation never happened\n"); + failed = TRUE; + } + assert(!failed); /* -- 2.39.0