]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Regression test for bug where pthread_kill will deliver a signal to a
authorJulian Seward <jseward@acm.org>
Wed, 18 Sep 2002 15:27:54 +0000 (15:27 +0000)
committerJulian Seward <jseward@acm.org>
Wed, 18 Sep 2002 15:27:54 +0000 (15:27 +0000)
thread even though that thread has the signal blocked.

MERGE TO ERASER

git-svn-id: svn://svn.valgrind.org/valgrind/branches/VALGRIND_1_0_BRANCH@1076

tests/Makefile.am
tests/pth_blockedsig.c [new file with mode: 0644]

index 38396140c8f8c3e422eeaf6d404e42d631b0be9b..00dab8a53702d2635cd00c1047ef9c44744b6886 100644 (file)
@@ -31,4 +31,5 @@ EXTRA_DIST = \
        discard.c pth_semaphore1.c new_override.cpp pth_yield.c \
        sigaltstack.c erringfds.c sigwait_all.c \
        pth_cancel1.c pth_cancel2.c pth_signal_gober.c nanoleak.c \
-       pth_pause.c pth_sigpending.c pth_atfork1.c
+       pth_pause.c pth_sigpending.c pth_atfork1.c \
+       fpu_28_108.S pth_blockedsig.c
diff --git a/tests/pth_blockedsig.c b/tests/pth_blockedsig.c
new file mode 100644 (file)
index 0000000..7699e65
--- /dev/null
@@ -0,0 +1,64 @@
+
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdio.h>
+#include <signal.h>
+#include <pthread.h>
+
+static void sig_usr1(int);
+
+static pthread_t main_thread;
+
+void *
+child_main(void *no_args)
+{
+  int i;
+  
+  for (i = 0; i < 5; ++i)
+    {
+      sleep (1);
+      fprintf (stdout, "thread %ld sending SIGUSR1 to thread %ld\n",
+               pthread_self (), main_thread);
+      if (pthread_kill (main_thread, SIGUSR1) != 0)
+        fprintf (stderr, "error doing pthread_kill\n"); 
+    }
+
+  return no_args;
+}
+
+int
+main(void)
+{
+  struct sigaction sigact;
+  sigset_t newmask, oldmask;
+  pthread_t child;
+
+  memset(&newmask, 0, sizeof newmask);
+  sigemptyset (&newmask);
+  sigaddset (&newmask, SIGUSR1);
+
+  if (pthread_sigmask (SIG_BLOCK, &newmask, &oldmask) != 0)
+    fprintf (stderr, "SIG_BLOCK error");
+  
+  memset (&sigact, 0, sizeof sigact);
+  sigact.sa_handler = sig_usr1;
+  if (sigaction(SIGUSR1, &sigact, NULL) != 0)
+    fprintf (stderr, "signal(SIGINT) error");
+  
+  main_thread = pthread_self ();
+  if (pthread_create (&child, NULL, child_main, NULL) != 0)
+    fprintf (stderr, "error creating thread");
+
+  pthread_join (child, NULL);
+  
+  exit(0);
+}
+
+static void
+sig_usr1 (int signo)
+{
+  fprintf (stderr, "SHOULD NOT BE HERE (SIGUSR1)!!!!\n");
+  return;
+}