master
c 34 lines 835 Bytes
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #include "../libnetdata.h"
4
5 pid_t os_gettid(void) {
6 #if defined(HAVE_GETTID)
7 return gettid();
8 #elif defined(HAVE_PTHREAD_GETTHREADID_NP)
9 return (pid_t)pthread_getthreadid_np();
10 #elif defined(HAVE_PTHREAD_THREADID_NP)
11 uint64_t curthreadid;
12 pthread_threadid_np(NULL, &curthreadid);
13 return curthreadid;
14 #elif defined(OS_WINDOWS)
15 return (pid_t)GetCurrentThreadId();
16 #elif defined(OS_LINUX)
17 return (pid_t)syscall(SYS_gettid);
18 #else
19 return (pid_t)pthread_self();
20 #endif
21 }
22
23 static __thread pid_t gettid_cached_tid = 0;
24 ALWAYS_INLINE pid_t gettid_cached(void) {
25 if(unlikely(gettid_cached_tid == 0))
26 gettid_cached_tid = os_gettid();
27
28 return gettid_cached_tid;
29 }
30
31 pid_t gettid_uncached(void) {
32 gettid_cached_tid = 0;
33 return gettid_cached();
34 }