about summary refs log tree commit diff
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
glibc-roland/getpid.tar.xz
glibc-roland/getpid.zip
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)