1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#include <unistd.h>
21#include <tls.h>
22#include <sysdep.h>
23
24
25#ifndef NOT_IN_libc
26static inline __attribute__((always_inline)) pid_t really_getpid (pid_t oldval);
27
28static inline __attribute__((always_inline)) pid_t
29really_getpid (pid_t oldval)
30{
31 if (__builtin_expect (oldval == 0, 1))
32 {
33 pid_t selftid = THREAD_GETMEM (THREAD_SELF, tid);
34 if (__builtin_expect (selftid != 0, 1))
35 return selftid;
36 }
37
38 INTERNAL_SYSCALL_DECL (err);
39 pid_t result = INTERNAL_SYSCALL (getpid, err, 0);
40
41
42
43 if (oldval == 0)
44 THREAD_SETMEM (THREAD_SELF, tid, result);
45 return result;
46}
47#endif
48
49pid_t
50__getpid (void)
51{
52#ifdef NOT_IN_libc
53 INTERNAL_SYSCALL_DECL (err);
54 pid_t result = INTERNAL_SYSCALL (getpid, err, 0);
55#else
56 pid_t result = THREAD_GETMEM (THREAD_SELF, pid);
57 if (__builtin_expect (result <= 0, 0))
58 result = really_getpid (result);
59#endif
60 return result;
61}
62
63libc_hidden_def (__getpid)
64weak_alias (__getpid, getpid)
65libc_hidden_def (getpid)
66