Simplify getpid handling of the race case.

This commit is contained in:
Roland McGrath 2014-05-09 14:18:59 -07:00
parent 0a982a2905
commit 681467942d
2 changed files with 13 additions and 31 deletions

View File

@ -1,3 +1,10 @@
2014-05-09 Roland McGrath <roland@hack.frob.com>
* nptl/sysdeps/unix/sysv/linux/getpid.c
(really_getpid): Function removed.
(__getpid): Rewritten. Under [!NOT_IN_libc], use THREAD_SELF->pid if
it's > 0. Otherwise always just make the system call.
2014-05-09 Roland McGrath <roland@hack.frob.com> 2014-05-09 Roland McGrath <roland@hack.frob.com>
* sysdeps/arm/armv7/strcmp.S: Use sfi_breg prefix on loads not from sp. * sysdeps/arm/armv7/strcmp.S: Use sfi_breg prefix on loads not from sp.

View File

@ -21,42 +21,17 @@
#include <sysdep.h> #include <sysdep.h>
#ifndef NOT_IN_libc
static inline __attribute__((always_inline)) pid_t really_getpid (pid_t oldval);
static inline __attribute__((always_inline)) pid_t
really_getpid (pid_t oldval)
{
if (__glibc_likely (oldval == 0))
{
pid_t selftid = THREAD_GETMEM (THREAD_SELF, tid);
if (__glibc_likely (selftid != 0))
return selftid;
}
INTERNAL_SYSCALL_DECL (err);
pid_t result = INTERNAL_SYSCALL (getpid, err, 0);
/* We do not set the PID field in the TID here since we might be
called from a signal handler while the thread executes fork. */
if (oldval == 0)
THREAD_SETMEM (THREAD_SELF, tid, result);
return result;
}
#endif
pid_t pid_t
__getpid (void) __getpid (void)
{ {
#ifdef NOT_IN_libc #ifndef NOT_IN_libc
INTERNAL_SYSCALL_DECL (err);
pid_t result = INTERNAL_SYSCALL (getpid, err, 0);
#else
pid_t result = THREAD_GETMEM (THREAD_SELF, pid); pid_t result = THREAD_GETMEM (THREAD_SELF, pid);
if (__glibc_unlikely (result <= 0)) if (__glibc_likely (result > 0))
result = really_getpid (result); return result;
#endif #endif
return result;
INTERNAL_SYSCALL_DECL (err);
return INTERNAL_SYSCALL (getpid, err, 0);
} }
libc_hidden_def (__getpid) libc_hidden_def (__getpid)