diff options
author | Roland McGrath <roland@hack.frob.com> | 2014-05-09 14:18:59 -0700 |
---|---|---|
committer | Roland McGrath <roland@hack.frob.com> | 2014-05-09 14:18:59 -0700 |
commit | 681467942d000f8f932ea1cc851b698dab5da85f (patch) | |
tree | adb7eae5372b321f825c5472a2d5dd8f6bbd1c86 | |
parent | 0a982a290552807c82c9ebcca9337cf9f5ddcf2c (diff) | |
download | glibc-681467942d000f8f932ea1cc851b698dab5da85f.tar.gz glibc-681467942d000f8f932ea1cc851b698dab5da85f.tar.xz glibc-681467942d000f8f932ea1cc851b698dab5da85f.zip |
Simplify getpid handling of the race case. roland/getpid
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | 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,5 +1,12 @@ 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> + * sysdeps/arm/armv7/strcmp.S: Use sfi_breg prefix on loads not from sp. [NO_THUMB]: Cope without cbz, cnbz, and orn instructions. 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 <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 __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) |