xref: /freebsd/contrib/llvm-project/libc/src/__support/threads/sleep.h (revision bb722a7d0f1642bff6487f943ad0427799a6e5bf)
1*bb722a7dSDimitry Andric //===-- Utilities for suspending threads ----------------------------------===//
2*bb722a7dSDimitry Andric //
3*bb722a7dSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*bb722a7dSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*bb722a7dSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*bb722a7dSDimitry Andric //
7*bb722a7dSDimitry Andric //===----------------------------------------------------------------------===//
8*bb722a7dSDimitry Andric 
9*bb722a7dSDimitry Andric #ifndef LLVM_LIBC_SRC___SUPPORT_THREADS_SLEEP_H
10*bb722a7dSDimitry Andric #define LLVM_LIBC_SRC___SUPPORT_THREADS_SLEEP_H
11*bb722a7dSDimitry Andric 
12*bb722a7dSDimitry Andric #include "src/__support/macros/attributes.h"
13*bb722a7dSDimitry Andric #include "src/__support/macros/config.h"
14*bb722a7dSDimitry Andric 
15*bb722a7dSDimitry Andric namespace LIBC_NAMESPACE_DECL {
16*bb722a7dSDimitry Andric 
17*bb722a7dSDimitry Andric /// Suspend the thread briefly to assist the thread scheduler during busy loops.
sleep_briefly()18*bb722a7dSDimitry Andric LIBC_INLINE void sleep_briefly() {
19*bb722a7dSDimitry Andric #if defined(LIBC_TARGET_ARCH_IS_NVPTX)
20*bb722a7dSDimitry Andric   if (__nvvm_reflect("__CUDA_ARCH") >= 700)
21*bb722a7dSDimitry Andric     LIBC_INLINE_ASM("nanosleep.u32 64;" ::: "memory");
22*bb722a7dSDimitry Andric #elif defined(LIBC_TARGET_ARCH_IS_AMDGPU)
23*bb722a7dSDimitry Andric   __builtin_amdgcn_s_sleep(2);
24*bb722a7dSDimitry Andric #elif defined(LIBC_TARGET_ARCH_IS_X86)
25*bb722a7dSDimitry Andric   __builtin_ia32_pause();
26*bb722a7dSDimitry Andric #elif defined(LIBC_TARGET_ARCH_IS_AARCH64) && __has_builtin(__builtin_arm_isb)
27*bb722a7dSDimitry Andric   __builtin_arm_isb(0xf);
28*bb722a7dSDimitry Andric #elif defined(LIBC_TARGET_ARCH_IS_AARCH64)
29*bb722a7dSDimitry Andric   asm volatile("isb\n" ::: "memory");
30*bb722a7dSDimitry Andric #else
31*bb722a7dSDimitry Andric   // Simply do nothing if sleeping isn't supported on this platform.
32*bb722a7dSDimitry Andric #endif
33*bb722a7dSDimitry Andric }
34*bb722a7dSDimitry Andric 
35*bb722a7dSDimitry Andric } // namespace LIBC_NAMESPACE_DECL
36*bb722a7dSDimitry Andric 
37*bb722a7dSDimitry Andric #endif // LLVM_LIBC_SRC___SUPPORT_THREADS_SLEEP_H
38