From db54f488ee24b14027c485e0005950dfdd5ef885 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 8 Jul 2003 03:40:49 +0000 Subject: Update. 2003-07-07 Ulrich Drepper * descr.h (struct pthread): Add pid field. * allocatestack.c (allocate_stack): Initialize pid field in descriptor. (__reclaim_stacks): Likewise. * init.c (sigcancel_handler): If __ASSUME_CORRECT_SI_PID is defined also check for PID of the signal source. (__pthread_initialize_minimal_internal): Also initialize pid field of initial thread's descriptor. * pthread_cancel.c: Use tgkill instead of tkill if possible. * sysdeps/unix/sysv/linux/fork.c: Likewise. * sysdeps/unix/sysv/linux/pt-raise.c: Likewise. * sysdeps/unix/sysv/linux/pthread_kill.c: Likewise. * sysdeps/unix/sysv/linux/raise.c: Likewise. --- nptl/sysdeps/unix/sysv/linux/fork.c | 3 +++ nptl/sysdeps/unix/sysv/linux/pt-raise.c | 16 ++++++++++++++-- nptl/sysdeps/unix/sysv/linux/pthread_kill.c | 15 ++++++++++++++- nptl/sysdeps/unix/sysv/linux/raise.c | 15 ++++++++++++++- 4 files changed, 45 insertions(+), 4 deletions(-) (limited to 'nptl/sysdeps/unix') diff --git a/nptl/sysdeps/unix/sysv/linux/fork.c b/nptl/sysdeps/unix/sysv/linux/fork.c index 8bca6b4..43e1b43 100644 --- a/nptl/sysdeps/unix/sysv/linux/fork.c +++ b/nptl/sysdeps/unix/sysv/linux/fork.c @@ -134,6 +134,9 @@ __libc_fork (void) if (__fork_generation_pointer != NULL) *__fork_generation_pointer += 4; + /* Adjust the PID field for the new process. */ + self->pid = self->tid; + #if HP_TIMING_AVAIL /* The CPU clock of the thread and process have to be set to zero. */ hp_timing_t now; diff --git a/nptl/sysdeps/unix/sysv/linux/pt-raise.c b/nptl/sysdeps/unix/sysv/linux/pt-raise.c index 0c68960..2efd761 100644 --- a/nptl/sysdeps/unix/sysv/linux/pt-raise.c +++ b/nptl/sysdeps/unix/sysv/linux/pt-raise.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -21,11 +21,23 @@ #include #include #include +#include int raise (sig) int sig; { - return INLINE_SYSCALL (tkill, 2, THREAD_SELF->tid, sig); +#if __ASSUME_TGKILL + return INLINE_SYSCALL (tgkill, 3, THREAD_GETMEM (THREAD_SELF, pid), + THREAD_GETMEM (THREAD_SELF, tid), sig); +#else +# ifdef __NR_tgkill + int res = INLINE_SYSCALL (tgkill, 3, THREAD_GETMEM (THREAD_SELF, pid), + THREAD_GETMEM (THREAD_SELF, tid), sig); + if (res != -1 || errno != ENOSYS) + return res; +# endif + return INLINE_SYSCALL (tkill, 2, THREAD_GETMEM (THREAD_SELF, tid), sig); +#endif } diff --git a/nptl/sysdeps/unix/sysv/linux/pthread_kill.c b/nptl/sysdeps/unix/sysv/linux/pthread_kill.c index 8da195a..6967acd 100644 --- a/nptl/sysdeps/unix/sysv/linux/pthread_kill.c +++ b/nptl/sysdeps/unix/sysv/linux/pthread_kill.c @@ -22,6 +22,7 @@ #include #include #include +#include int @@ -43,7 +44,19 @@ __pthread_kill (threadid, signo) /* We have a special syscall to do the work. */ INTERNAL_SYSCALL_DECL (err); - int val = INTERNAL_SYSCALL (tkill, err, 2, pd->tid, signo); + int val; +#if __ASSUME_TGKILL + val = INTERNAL_SYSCALL (tgkill, err, 3, THREAD_GETMEM (THREAD_SELF, pid), + pd->tid, signo); +#else +# ifdef __NR_tgkill + val = INTERNAL_SYSCALL (tgkill, err, 3, THREAD_GETMEM (THREAD_SELF, pid), + pd->tid, signo); + if (INTERNAL_SYSCALL_ERROR_P (val, err) + && INTERNAL_SYSCALL_ERRNO (val, err) == ENOSYS) +# endif + val = INTERNAL_SYSCALL (tkill, err, 2, pd->tid, signo); +#endif return (INTERNAL_SYSCALL_ERROR_P (val, err) ? INTERNAL_SYSCALL_ERRNO (val, err) : 0); diff --git a/nptl/sysdeps/unix/sysv/linux/raise.c b/nptl/sysdeps/unix/sysv/linux/raise.c index 24a00b1..25d3ed8 100644 --- a/nptl/sysdeps/unix/sysv/linux/raise.c +++ b/nptl/sysdeps/unix/sysv/linux/raise.c @@ -21,6 +21,7 @@ #include #include #include +#include int @@ -28,7 +29,7 @@ raise (sig) int sig; { struct pthread *pd = THREAD_SELF; - pid_t selftid = pd->tid; + pid_t selftid = THREAD_GETMEM (pd, tid); if (selftid == 0) { /* This system call is not supposed to fail. */ @@ -39,9 +40,21 @@ raise (sig) selftid = INLINE_SYSCALL (gettid, 0); #endif THREAD_SETMEM (pd, tid, selftid); + + /* In this case the TID and PID are the same. */ + THREAD_SETMEM (pd, pid, selftid); } +#if __ASSUME_TGKILL + return INLINE_SYSCALL (tgkill, 3, THREAD_GETMEM (pd, pid), selftid, sig); +#else +# ifdef __NR_tgkill + int res = INLINE_SYSCALL (tgkill, 3, THREAD_GETMEM (pd, pid), selftid, sig); + if (res != -1 || errno != ENOSYS) + return res; +# endif return INLINE_SYSCALL (tkill, 2, selftid, sig); +#endif } libc_hidden_def (raise) weak_alias (raise, gsignal) -- cgit v1.1