summary refs log tree commit diff
path: root/nptl
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-12-05 07:50:01 +0000
committerUlrich Drepper <drepper@redhat.com>2004-12-05 07:50:01 +0000
commit1ff241b87cd7afc1d3fde050d0d73932fe721587 (patch)
tree878b132ef977a0f5d7be19ec639b208d8f53ecab /nptl
parent110b21a2ba88c55a06ba9fca9a5d92021feda9dc (diff)
downloadglibc-1ff241b87cd7afc1d3fde050d0d73932fe721587.tar.gz
glibc-1ff241b87cd7afc1d3fde050d0d73932fe721587.tar.xz
glibc-1ff241b87cd7afc1d3fde050d0d73932fe721587.zip
Update.
2004-12-04  Ulrich Drepper  <drepper@redhat.com>

	* sysdeps/unix/sysv/linux/i386/clone.S: Add support for NPTL where
	the PID is stored at userlevel and needs to be reset when CLONE_THREAD
	is not used.
	* sysdeps/unix/sysv/linux/86_64/clone.S: Likewise.

	* sysdeps/unix/sysv/linux/arm/clone.S: Update uses of RETINSTR.
	* sysdeps/unix/sysv/linux/arm/mmap.S: Likewise.
	* sysdeps/unix/sysv/linux/arm/mmap64.S: Likewise.
	* sysdeps/unix/sysv/linux/arm/socket.S: Likewise.
	* sysdeps/unix/sysv/linux/arm/sysdep.h: Likewise.
	* sysdeps/unix/sysv/linux/arm/vfork.S: Likewise.
Diffstat (limited to 'nptl')
-rw-r--r--nptl/ChangeLog7
-rw-r--r--nptl/Makefile3
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/clone.S2
-rw-r--r--nptl/tst-getpid1.c99
4 files changed, 110 insertions, 1 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index f045eea012..db184cf140 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,3 +1,10 @@
+2004-12-04  Ulrich Drepper  <drepper@redhat.com>
+
+	* Makefile (tests): Add tst-getpid1.
+	* tst-getpid1.c: New file.
+	* sysdeps/unix/sysv/linux/i386/clone.S: New file.
+	* sysdeps/unix/sysv/linux/x86_64/clone.S: New file.
+
 2004-12-02  Roland McGrath  <roland@redhat.com>
 
 	* Makefile (libpthread-nonshared): Variable removed.
diff --git a/nptl/Makefile b/nptl/Makefile
index f9993dd1fd..ecd5e52cdb 100644
--- a/nptl/Makefile
+++ b/nptl/Makefile
@@ -240,7 +240,8 @@ tests = tst-attr1 tst-attr2 tst-attr3 \
 	tst-sched1 \
 	tst-backtrace1 \
 	tst-oddstacklimit \
-	tst-vfork1 tst-vfork2 tst-vfork1x tst-vfork2x
+	tst-vfork1 tst-vfork2 tst-vfork1x tst-vfork2x \
+	tst-getpid1
 xtests = tst-setuid1 tst-setuid1-static
 
 # Files which must not be linked with libpthread.
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/clone.S b/nptl/sysdeps/unix/sysv/linux/x86_64/clone.S
new file mode 100644
index 0000000000..dfa6adb3e2
--- /dev/null
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/clone.S
@@ -0,0 +1,2 @@
+#define RESET_PID
+#include <sysdeps/unix/sysv/linux/x86_64/clone.S>
diff --git a/nptl/tst-getpid1.c b/nptl/tst-getpid1.c
new file mode 100644
index 0000000000..9d637159c4
--- /dev/null
+++ b/nptl/tst-getpid1.c
@@ -0,0 +1,99 @@
+#include <sched.h>
+#include <signal.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+static int sig;
+
+static int
+f (void *a)
+{
+  puts ("in f");
+  union sigval sival;
+  sival.sival_int = getpid ();
+  printf ("pid = %d\n", sival.sival_int);
+  if (sigqueue (getppid (), sig, sival) != 0)
+    return 1;
+  return 0;
+}
+
+
+static int
+do_test (void)
+{
+  int mypid = getpid ();
+
+  sig = SIGRTMIN;
+  sigset_t ss;
+  sigemptyset (&ss);
+  sigaddset (&ss, sig);
+  if (sigprocmask (SIG_BLOCK, &ss, NULL) != 0)
+    {
+      printf ("sigprocmask failed: %m\n");
+      return 1;
+    }
+
+  char st[128 * 1024];
+  pid_t p = clone (f, st + sizeof (st), 0, 0);
+  if (p == -1)
+    {
+      printf("clone failed: %m\n");
+      return 1;
+    }
+  printf ("new thread: %d\n", (int) p);
+
+  siginfo_t si;
+  do
+    if (sigwaitinfo (&ss, &si) < 0)
+      {
+	printf("sigwaitinfo failed: %m\n");
+	kill (p, SIGKILL);
+	return 1;
+      }
+  while  (si.si_signo != sig || si.si_code != SI_QUEUE);
+
+  if (si.si_int != (int) p)
+    {
+      printf ("expected PID %d, got si_int %d\n", (int) p, si.si_int);
+      kill (p, SIGKILL);
+      return 1;
+    }
+
+  if (si.si_pid != p)
+    {
+      printf ("expected PID %d, got si_pid %d\n", (int) p, (int) si.si_pid);
+      kill (p, SIGKILL);
+      return 1;
+    }
+
+  int e;
+  if (waitpid (p, &e, __WCLONE) != p)
+    {
+      puts ("waitpid failed");
+      kill (p, SIGKILL);
+      return 1;
+    }
+  if (!WIFEXITED (e))
+    {
+      puts ("did not terminate correctly");
+      return 1;
+    }
+  if (WEXITSTATUS (e) != 0)
+    {
+      printf ("exit code %d\n", WEXITSTATUS (e));
+      return 1;
+    }
+
+  if (getpid () != mypid)
+    {
+      puts ("my PID changed");
+      return 1;
+    }
+
+  return 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"