about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--nptl/tst-cancel4-common.c12
-rw-r--r--nptl/tst-cancel4-common.h16
-rw-r--r--nptl/tst-cancel4.c42
4 files changed, 56 insertions, 24 deletions
diff --git a/ChangeLog b/ChangeLog
index 48cd1d3563..66627f1fb5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2016-07-05  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
+
+	* 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  <schwab@linux-m68k.org>
 
 	* 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 <sys/poll.h>
 #include <sys/wait.h>
 
-#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 ();
-
-  int r = pthread_barrier_wait (&b2);
-  if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
     {
-      printf ("%s: barrier_wait failed\n", __FUNCTION__);
-      exit (1);
+      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);
+	}
     }
 
-  r = pthread_barrier_wait (&b2);
+  int r = pthread_barrier_wait (&b2);
   if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
     {
-      printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__);
+      printf ("%s: 2nd barrier_wait failed: %m\n", __func__);
       exit (1);
     }
 
-  pthread_cleanup_push (cl, NULL);
+  pthread_cleanup_push (cl_fifo, NULL);
 
-  open ("Makefile", O_RDONLY);
+  open (arg ? "Makefile" : fifoname, O_RDONLY);
 
   pthread_cleanup_pop (0);