DRD: added a test program that forks a process containing a detached thread.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11526 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/drd/tests/Makefile.am b/drd/tests/Makefile.am
index ea28132..695841e 100644
--- a/drd/tests/Makefile.am
+++ b/drd/tests/Makefile.am
@@ -252,6 +252,8 @@
 	tc24_nonzero_sem.vgtest                     \
 	thread_name.stderr.exp			    \
 	thread_name.vgtest			    \
+	threaded-fork.stderr.exp		    \
+	threaded-fork.vgtest			    \
 	trylock.stderr.exp                          \
 	trylock.vgtest				    \
 	unit_bitmap.stderr.exp                      \
@@ -294,6 +296,7 @@
   sem_open            \
   sigalrm             \
   thread_name         \
+  threaded-fork       \
   trylock             \
   unit_bitmap         \
   unit_vc
diff --git a/drd/tests/threaded-fork.c b/drd/tests/threaded-fork.c
new file mode 100644
index 0000000..a83bf35
--- /dev/null
+++ b/drd/tests/threaded-fork.c
@@ -0,0 +1,55 @@
+/* fork a process that has created a detached thread. */
+
+#include <stdlib.h>
+#include <sys/wait.h>
+#include <pthread.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <signal.h>
+
+static void *threadmain(void *dummy)
+{
+	sleep((unsigned long)dummy);
+	return NULL;
+}
+
+int main(int argc, char **argv)
+{
+        int ctr;
+	pid_t childpid;
+	pthread_t childthread;
+	void *res;
+	int status;
+
+	pthread_create(&childthread, NULL, threadmain, (void *)2);
+	pthread_detach(childthread);
+
+	childpid = fork();
+	switch (childpid) {
+	case 0:
+		pthread_create(&childthread, NULL, threadmain, 0);
+		pthread_join(childthread, &res);
+		exit(0);
+		break;
+	case -1:
+		perror("FAILED: fork failed\n");
+		break;
+	default:
+		break;
+	}
+
+	ctr = 0;
+	while (waitpid(childpid, &status, 0) != childpid) {
+		sleep(1);
+		ctr++;
+		if (ctr >= 10) {
+		  fprintf(stderr, "FAILED - timeout waiting for child\n");
+		  return 0;
+		}
+	}
+
+	fprintf(stderr, "PASS\n");
+
+	return 0;
+}
diff --git a/drd/tests/threaded-fork.stderr.exp b/drd/tests/threaded-fork.stderr.exp
new file mode 100644
index 0000000..79bbd8e
--- /dev/null
+++ b/drd/tests/threaded-fork.stderr.exp
@@ -0,0 +1,6 @@
+
+
+ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
+PASS
+
+ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
diff --git a/drd/tests/threaded-fork.vgtest b/drd/tests/threaded-fork.vgtest
new file mode 100644
index 0000000..9449729
--- /dev/null
+++ b/drd/tests/threaded-fork.vgtest
@@ -0,0 +1,2 @@
+prereq: ./supported_libpthread
+prog: threaded-fork