1301db3deSSchrodinger ZHU Yifan //===--- Thread Identifier Header --------------------------------*- C++-*-===// 2301db3deSSchrodinger ZHU Yifan // 3301db3deSSchrodinger ZHU Yifan // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4301db3deSSchrodinger ZHU Yifan // See https://llvm.org/LICENSE.txt for license information. 5301db3deSSchrodinger ZHU Yifan // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6301db3deSSchrodinger ZHU Yifan // 7301db3deSSchrodinger ZHU Yifan //===----------------------------------------------------------------------===// 8301db3deSSchrodinger ZHU Yifan 9301db3deSSchrodinger ZHU Yifan #ifndef LLVM_LIBC_SRC___SUPPORT_THREADS_IDENTIFIER_H 10301db3deSSchrodinger ZHU Yifan #define LLVM_LIBC_SRC___SUPPORT_THREADS_IDENTIFIER_H 11301db3deSSchrodinger ZHU Yifan 12301db3deSSchrodinger ZHU Yifan #ifdef LIBC_FULL_BUILD 13301db3deSSchrodinger ZHU Yifan #include "src/__support/threads/thread.h" 14301db3deSSchrodinger ZHU Yifan #endif // LIBC_FULL_BUILD 15301db3deSSchrodinger ZHU Yifan 16301db3deSSchrodinger ZHU Yifan #include "hdr/types/pid_t.h" 17301db3deSSchrodinger ZHU Yifan #include "src/__support/OSUtil/syscall.h" 18*e14356a6SSchrodinger ZHU Yifan #include "src/__support/macros/optimization.h" 19301db3deSSchrodinger ZHU Yifan #include <sys/syscall.h> 20301db3deSSchrodinger ZHU Yifan 21301db3deSSchrodinger ZHU Yifan namespace LIBC_NAMESPACE_DECL { 22301db3deSSchrodinger ZHU Yifan namespace internal { 23301db3deSSchrodinger ZHU Yifan 24301db3deSSchrodinger ZHU Yifan LIBC_INLINE pid_t *get_tid_cache() { 25301db3deSSchrodinger ZHU Yifan #ifdef LIBC_FULL_BUILD 26301db3deSSchrodinger ZHU Yifan return &self.attrib->tid; 27301db3deSSchrodinger ZHU Yifan #else 28301db3deSSchrodinger ZHU Yifan // in non-full build mode, we do not control the fork routine. Therefore, 29301db3deSSchrodinger ZHU Yifan // we do not cache tid at all. 30301db3deSSchrodinger ZHU Yifan return nullptr; 31301db3deSSchrodinger ZHU Yifan #endif 32301db3deSSchrodinger ZHU Yifan } 33301db3deSSchrodinger ZHU Yifan 34301db3deSSchrodinger ZHU Yifan LIBC_INLINE pid_t gettid() { 35301db3deSSchrodinger ZHU Yifan pid_t *cache = get_tid_cache(); 36301db3deSSchrodinger ZHU Yifan if (LIBC_UNLIKELY(!cache || *cache <= 0)) 37301db3deSSchrodinger ZHU Yifan return syscall_impl<pid_t>(SYS_gettid); 38301db3deSSchrodinger ZHU Yifan return *cache; 39301db3deSSchrodinger ZHU Yifan } 40301db3deSSchrodinger ZHU Yifan 41301db3deSSchrodinger ZHU Yifan LIBC_INLINE void force_set_tid(pid_t tid) { 42301db3deSSchrodinger ZHU Yifan pid_t *cache = get_tid_cache(); 43301db3deSSchrodinger ZHU Yifan if (cache) 44301db3deSSchrodinger ZHU Yifan *cache = tid; 45301db3deSSchrodinger ZHU Yifan } 46301db3deSSchrodinger ZHU Yifan 47301db3deSSchrodinger ZHU Yifan } // namespace internal 48301db3deSSchrodinger ZHU Yifan } // namespace LIBC_NAMESPACE_DECL 49301db3deSSchrodinger ZHU Yifan 50301db3deSSchrodinger ZHU Yifan #endif // LLVM_LIBC_SRC___SUPPORT_THREADS_IDENTIFIER_H 51