diff options
author | Ulrich Drepper <drepper@redhat.com> | 2004-12-05 07:50:01 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2004-12-05 07:50:01 +0000 |
commit | 1ff241b87cd7afc1d3fde050d0d73932fe721587 (patch) | |
tree | 878b132ef977a0f5d7be19ec639b208d8f53ecab /nptl | |
parent | 110b21a2ba88c55a06ba9fca9a5d92021feda9dc (diff) | |
download | glibc-1ff241b87cd7afc1d3fde050d0d73932fe721587.zip glibc-1ff241b87cd7afc1d3fde050d0d73932fe721587.tar.gz glibc-1ff241b87cd7afc1d3fde050d0d73932fe721587.tar.bz2 |
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/ChangeLog | 7 | ||||
-rw-r--r-- | nptl/Makefile | 3 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/x86_64/clone.S | 2 | ||||
-rw-r--r-- | nptl/tst-getpid1.c | 99 |
4 files changed, 110 insertions, 1 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog index f045eea..db184cf 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 f9993dd..ecd5e52 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 0000000..dfa6adb --- /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 0000000..9d63715 --- /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" |