about summary refs log tree commit diff
path: root/nptl
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2004-12-07 14:01:11 +0000
committerJakub Jelinek <jakub@redhat.com>2004-12-07 14:01:11 +0000
commit37756a838922d080448793aa5ab5e90c5aba78c1 (patch)
tree043efc2dbba1e4c350c65704af85bd5a628ea561 /nptl
parent3b1744f208165b87fb8cd286d39b395c56257ee5 (diff)
downloadglibc-37756a838922d080448793aa5ab5e90c5aba78c1.tar.gz
glibc-37756a838922d080448793aa5ab5e90c5aba78c1.tar.xz
glibc-37756a838922d080448793aa5ab5e90c5aba78c1.zip
Updated to fedora-glibc-20041207T1331
Diffstat (limited to 'nptl')
-rw-r--r--nptl/ChangeLog17
-rw-r--r--nptl/Makefile3
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/clone.S2
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/clone.S2
-rw-r--r--nptl/tst-getpid1.c99
5 files changed, 112 insertions, 11 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index 54554ed839..1cd8b62142 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-01  Jakub Jelinek  <jakub@redhat.com>
 
 	* sysdeps/unix/sysv/linux/bits/posix_opt.h (_POSIX_CPUTIME,
@@ -22,12 +29,6 @@
 	These are now handled by generic magic from
 	libpthread-static-only-routines being set.
 
-2004-11-17  Roland McGrath  <roland@redhat.com>
-
-	* sysdeps/unix/sysv/linux/timer_create.c (timer_create): Handle
-	CLOCK_PROCESS_CPUTIME_ID and CLOCK_PROCESS_THREAD_ID specially,
-	translating to the kernel clockid_t for our own process/thread clock.
-
 2004-11-27  Ulrich Drepper  <drepper@redhat.com>
 
 	* sysdeps/unix/sysv/linux/bits/posix_opt.h (_POSIX_PRIORITIZED_IO,
@@ -118,10 +119,6 @@
 	here, before calling clone.
 	* pthread_create.c (start_thread): Don't do it here.
 
-2004-11-04  Roland McGrath  <roland@redhat.com>
-
-	* sysdeps/unix/sysv/linux/pthread_getcpuclockid.c: New file.
-
 2004-11-02  Jakub Jelinek  <jakub@redhat.com>
 
 	* sysdeps/unix/sysv/linux/smp.h: Include <errno.h>.
diff --git a/nptl/Makefile b/nptl/Makefile
index d677318d00..9eb61927e3 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/i386/clone.S b/nptl/sysdeps/unix/sysv/linux/i386/clone.S
new file mode 100644
index 0000000000..95c17f18e4
--- /dev/null
+++ b/nptl/sysdeps/unix/sysv/linux/i386/clone.S
@@ -0,0 +1,2 @@
+#define RESET_PID
+#include <sysdeps/unix/sysv/linux/i386/clone.S>
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"