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/tst-getpid1.c | |
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/tst-getpid1.c')
-rw-r--r-- | nptl/tst-getpid1.c | 99 |
1 files changed, 99 insertions, 0 deletions
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" |