diff options
Diffstat (limited to 'nptl/tst-cond22.c')
-rw-r--r-- | nptl/tst-cond22.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/nptl/tst-cond22.c b/nptl/tst-cond22.c index 1094c09..e7c8d01 100644 --- a/nptl/tst-cond22.c +++ b/nptl/tst-cond22.c @@ -30,17 +30,24 @@ tf (void *arg) exit (1); } pthread_cleanup_push (cl, NULL); - if (pthread_cond_wait (&c, &m) != 0) - { - printf ("%s: cond_wait failed\n", __func__); - exit (1); + /* We have to loop here because the cancellation might come after + the cond_wait call left the cancelable area and is then waiting + on the mutex. In this case the beginning of the second cond_wait + call will cause the cancellation to happen. */ + while (1) + { + if (pthread_cond_wait (&c, &m) != 0) + { + printf ("%s: cond_wait failed\n", __func__); + exit (1); + } + if (pthread_mutex_unlock (&m) != 0) + { + printf ("%s: mutex_unlock failed\n", __func__); + exit (1); + } } pthread_cleanup_pop (0); - if (pthread_mutex_unlock (&m) != 0) - { - printf ("%s: mutex_unlock failed\n", __func__); - exit (1); - } return NULL; } |