From 681467942d000f8f932ea1cc851b698dab5da85f Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Fri, 9 May 2014 14:18:59 -0700 Subject: Simplify getpid handling of the race case. --- ChangeLog | 7 +++++++ nptl/sysdeps/unix/sysv/linux/getpid.c | 37 ++++++----------------------------- 2 files changed, 13 insertions(+), 31 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2c08c5041c..0f0238d81b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2014-05-09 Roland McGrath + + * 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 * sysdeps/arm/armv7/strcmp.S: Use sfi_breg prefix on loads not from sp. diff --git a/nptl/sysdeps/unix/sysv/linux/getpid.c b/nptl/sysdeps/unix/sysv/linux/getpid.c index 937b1d4e11..9dcf38cc30 100644 --- a/nptl/sysdeps/unix/sysv/linux/getpid.c +++ b/nptl/sysdeps/unix/sysv/linux/getpid.c @@ -21,42 +21,17 @@ #include -#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 __getpid (void) { -#ifdef NOT_IN_libc - INTERNAL_SYSCALL_DECL (err); - pid_t result = INTERNAL_SYSCALL (getpid, err, 0); -#else +#ifndef NOT_IN_libc pid_t result = THREAD_GETMEM (THREAD_SELF, pid); - if (__glibc_unlikely (result <= 0)) - result = really_getpid (result); + if (__glibc_likely (result > 0)) + return result; #endif - return result; + + INTERNAL_SYSCALL_DECL (err); + return INTERNAL_SYSCALL (getpid, err, 0); } libc_hidden_def (__getpid) -- cgit 1.4.1