summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoland McGrath <roland@hack.frob.com>2014-05-09 14:18:59 -0700
committerRoland McGrath <roland@hack.frob.com>2014-05-09 14:18:59 -0700
commit681467942d000f8f932ea1cc851b698dab5da85f (patch)
treeadb7eae5372b321f825c5472a2d5dd8f6bbd1c86
parent0a982a290552807c82c9ebcca9337cf9f5ddcf2c (diff)
downloadglibc-roland/getpid.tar.gz
Simplify getpid handling of the race case.roland/getpid
-rw-r--r--ChangeLog7
-rw-r--r--nptl/sysdeps/unix/sysv/linux/getpid.c37
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)