]> granicus.if.org Git - strace/commitdiff
2007-07-05 Jan Kratochvil <jan.kratochvil@redhat.com>
authorRoland McGrath <roland@redhat.com>
Thu, 5 Jul 2007 18:43:18 +0000 (18:43 +0000)
committerRoland McGrath <roland@redhat.com>
Thu, 5 Jul 2007 18:43:18 +0000 (18:43 +0000)
* test/leaderkill.c: New file.
* test/.cvsignore, test/Makefile: Add it.

test/.cvsignore
test/Makefile
test/leaderkill.c [new file with mode: 0644]

index c054dbaddd754b58ea04f90face4a92a5091f911..c415255686f8ac7eeaef5c1b9de64cb7929c7295 100644 (file)
@@ -3,3 +3,4 @@ sig
 skodic
 vfork
 clone
+leaderkill
index cc7c0115bcb9d31d736e68560faf2139b2516456..2879c086b0eccc72e2999a407f97d92cca3bfb3e 100644 (file)
@@ -2,8 +2,10 @@
 # $Id$
 #
 
-all: vfork fork sig skodic clone
+all: vfork fork sig skodic clone leaderkill
+
+leaderkill: LDFLAGS += -pthread
 
 clean distclean:
-       rm -f clone vfork fork sig *.o core
+       rm -f clone vfork fork sig leaderkill *.o core
 
diff --git a/test/leaderkill.c b/test/leaderkill.c
new file mode 100644 (file)
index 0000000..51f0c6c
--- /dev/null
@@ -0,0 +1,59 @@
+/* Test handle_group_exit () handling of a thread leader still alive with its
+ * thread child calling exit_group () and proper passing of the process exit
+ * code to the process parent of this whole thread group.
+ * 
+ * gcc -o test/leaderkill test/leaderkill.c -Wall -ggdb2 -pthread;./test/leaderkill & pid=$!;sleep 1;strace -o x -q ./strace -f -p $pid
+ * It must print: write(1, "OK\n", ...
+ */
+
+#include <pthread.h>
+#include <assert.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/wait.h>
+
+static void *start (void *arg)
+{
+  sleep (1);
+
+  exit (42);
+}
+
+int main (void)
+{
+  pthread_t thread1;
+  int i;
+  pid_t child, got_pid;
+  int status;
+
+  sleep (2);
+
+  child = fork ();
+  switch (child)
+    {
+      case -1:
+       abort ();
+      case 0:
+       i = pthread_create (&thread1, NULL, start, NULL);
+       assert (i == 0);
+/* Two possible testcases; the second one passed even in the older versions.  */
+#if 1
+       pause ();
+#else
+       pthread_exit (NULL);
+#endif
+       /* NOTREACHED */
+       abort ();
+       break;
+      default:
+       got_pid = waitpid (child, &status, 0);
+       assert (got_pid == child);
+       assert (WIFEXITED (status));
+       assert (WEXITSTATUS (status) == 42);
+       puts ("OK");
+       exit (0);
+    }
+  /* NOTREACHED */
+  abort ();
+}