diff --git a/ChangeLog b/ChangeLog index 48cd1d3563..66627f1fb5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2016-07-05 Adhemerval Zanella + + * nptl/tst-cancel4-common.c (do_test): Add temporary fifo creation. + * nptl/tst-cancel4-common.h (fifoname): New variable. + (fifofd): Likewise. + (cl_fifo): New function. + * nptl/tst-cancel4.c (tf_sigpause): Replace SIGCANCEL usage by + SIGINT. + (tf_open): Add early cancel test. + 2016-07-04 Andreas Schwab * sysdeps/m68k/Makefile (CFLAGS-mcount.c): Define. diff --git a/nptl/tst-cancel4-common.c b/nptl/tst-cancel4-common.c index f235d534c8..7cb5411252 100644 --- a/nptl/tst-cancel4-common.c +++ b/nptl/tst-cancel4-common.c @@ -44,6 +44,12 @@ do_test (void) } setsockopt (fds[1], SOL_SOCKET, SO_SNDBUF, &val, sizeof(val)); + if (mktemp (fifoname) == NULL) + { + printf ("%s: cannot generate temp file name: %m\n", __func__); + exit (1); + } + int result = 0; size_t cnt; for (cnt = 0; cnt < ntest_tf; ++cnt) @@ -71,7 +77,7 @@ do_test (void) int r = pthread_barrier_wait (&b2); if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) { - printf ("%s: barrier_wait failed\n", __FUNCTION__); + printf ("%s: barrier_wait failed\n", __func__); result = 1; continue; } @@ -169,7 +175,7 @@ do_test (void) int r = pthread_barrier_wait (&b2); if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) { - printf ("%s: barrier_wait failed\n", __FUNCTION__); + printf ("%s: barrier_wait failed\n", __func__); result = 1; continue; } @@ -184,7 +190,7 @@ do_test (void) r = pthread_barrier_wait (&b2); if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) { - printf ("%s: barrier_wait failed\n", __FUNCTION__); + printf ("%s: barrier_wait failed\n", __func__); result = 1; continue; } diff --git a/nptl/tst-cancel4-common.h b/nptl/tst-cancel4-common.h index e1683c435b..06ed0dc1ba 100644 --- a/nptl/tst-cancel4-common.h +++ b/nptl/tst-cancel4-common.h @@ -67,6 +67,22 @@ cl (void *arg) ++cl_called; } +/* Named pipe used to check for blocking open. It should be closed + after the cancellation handling. */ +static char fifoname[] = "/tmp/tst-cancel4-fifo-XXXXXX"; +static int fifofd; + +static void +__attribute__ ((used)) +cl_fifo (void *arg) +{ + ++cl_called; + + unlink (fifoname); + close (fifofd); + fifofd = -1; +} + struct cancel_tests { const char *name; diff --git a/nptl/tst-cancel4.c b/nptl/tst-cancel4.c index 4221af4bdf..fd0ab4070e 100644 --- a/nptl/tst-cancel4.c +++ b/nptl/tst-cancel4.c @@ -36,8 +36,6 @@ #include #include -#include "pthreadP.h" - /* Since STREAMS are not supported in the standard Linux kernel and there we don't advertise STREAMS as supported is no need to test @@ -67,6 +65,7 @@ #include "tst-cancel4-common.h" + #ifndef IPC_ADDVAL # define IPC_ADDVAL 0 #endif @@ -734,13 +733,7 @@ tf_sigpause (void *arg) pthread_cleanup_push (cl, NULL); -#ifdef SIGCANCEL - /* Just for fun block the cancellation signal. We need to use - __xpg_sigpause since otherwise we will get the BSD version. */ - __xpg_sigpause (SIGCANCEL); -#else - pause (); -#endif + sigpause (sigmask (SIGINT)); pthread_cleanup_pop (0); @@ -1348,27 +1341,34 @@ static void * tf_open (void *arg) { if (arg == NULL) - // XXX If somebody can provide a portable test case in which open() - // blocks we can enable this test to run in both rounds. - abort (); + { + fifofd = mkfifo (fifoname, S_IWUSR | S_IRUSR); + if (fifofd == -1) + { + printf ("%s: mkfifo failed: %m\n", __func__); + exit (1); + } + } + else + { + int r = pthread_barrier_wait (&b2); + if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) + { + printf ("%s: barrier_wait failed: %m\n", __func__); + exit (1); + } + } int r = pthread_barrier_wait (&b2); if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) { - printf ("%s: barrier_wait failed\n", __FUNCTION__); + printf ("%s: 2nd barrier_wait failed: %m\n", __func__); exit (1); } - r = pthread_barrier_wait (&b2); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__); - exit (1); - } + pthread_cleanup_push (cl_fifo, NULL); - pthread_cleanup_push (cl, NULL); - - open ("Makefile", O_RDONLY); + open (arg ? "Makefile" : fifoname, O_RDONLY); pthread_cleanup_pop (0);