diff options
Diffstat (limited to 'winsup/testsuite')
-rw-r--r-- | winsup/testsuite/winsup.api/pthread/cancel3.c | 24 | ||||
-rw-r--r-- | winsup/testsuite/winsup.api/pthread/cancel5.c | 24 |
2 files changed, 36 insertions, 12 deletions
diff --git a/winsup/testsuite/winsup.api/pthread/cancel3.c b/winsup/testsuite/winsup.api/pthread/cancel3.c index 832fe2e3f..07feb7c9b 100644 --- a/winsup/testsuite/winsup.api/pthread/cancel3.c +++ b/winsup/testsuite/winsup.api/pthread/cancel3.c @@ -75,11 +75,22 @@ mythread(void * arg) assert(pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL) == 0); /* - * We wait up to 10 seconds, waking every 0.1 seconds, - * for a cancelation to be applied to us. + * We wait up to 10 seconds for a cancelation to be applied to us. */ - for (bag->count = 0; bag->count < 100; bag->count++) - Sleep(100); + for (bag->count = 0; bag->count < 10; bag->count++) + { + /* Busy wait to avoid Sleep(), since we can't asynchronous cancel inside a + kernel function. (This is still somewhat fragile as if the async cancel + can fail if it happens to occur while we're inside the kernel function + that time() calls...) */ + time_t start = time(NULL); + while ((time(NULL) - start) < 1) + { + int i; + for (i = 0; i < 1E7; i++) + __asm__ volatile ("pause":::); + } + } return result; } @@ -149,10 +160,11 @@ main() if (fail) { - fprintf(stderr, "Thread %d: started %d: count %d\n", + fprintf(stderr, "Thread %d: started %d: count %d: result %d \n", i, threadbag[i].started, - threadbag[i].count); + threadbag[i].count, + result); } failed = (failed || fail); } diff --git a/winsup/testsuite/winsup.api/pthread/cancel5.c b/winsup/testsuite/winsup.api/pthread/cancel5.c index 8b7240615..999b3c95c 100644 --- a/winsup/testsuite/winsup.api/pthread/cancel5.c +++ b/winsup/testsuite/winsup.api/pthread/cancel5.c @@ -76,11 +76,22 @@ mythread(void * arg) assert(pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL) == 0);
/*
- * We wait up to 10 seconds, waking every 0.1 seconds,
- * for a cancelation to be applied to us.
+ * We wait up to 10 seconds for a cancelation to be applied to us.
*/
- for (bag->count = 0; bag->count < 100; bag->count++)
- Sleep(100);
+ for (bag->count = 0; bag->count < 10; bag->count++)
+ {
+ /* Busy wait to avoid Sleep(), since we can't asynchronous cancel inside a
+ kernel function. (This is still somewhat fragile as if the async cancel
+ can fail if it happens to occur while we're inside the kernel function
+ that time() calls...) */
+ time_t start = time(NULL);
+ while ((time(NULL) - start) < 1)
+ {
+ int i;
+ for (i = 0; i < 1E7; i++)
+ __asm__ volatile ("pause":::);
+ }
+ }
return result;
}
@@ -148,10 +159,11 @@ main() if (fail)
{
- fprintf(stderr, "Thread %d: started %d: count %d\n",
+ fprintf(stderr, "Thread %d: started %d: count %d: result %d\n",
i,
threadbag[i].started,
- threadbag[i].count);
+ threadbag[i].count,
+ result);
}
failed = (failed || fail);
}
|