HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
thread.hpp
1// Copyright Take Vos 2019-2020.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "required.hpp"
8#include "architecture.hpp"
9#if HI_OPERATING_SYSTEM == HI_OS_WINDOWS
10#include <intrin.h>
11#endif
12#include <thread>
13#include <string_view>
14#include <functional>
15#include <atomic>
16#include <chrono>
17#include <bit>
18
19namespace hi::inline v1 {
20
27void set_thread_name(std::string_view name);
28
29#if HI_OPERATING_SYSTEM == HI_OS_WINDOWS
30constexpr std::size_t maximum_num_cpus = 64;
31#elif HI_OPERATING_SYSTEM == HI_OS_LINUX || HI_OPERATING_SYSTEM == HI_OS_MACOS
32constexpr std::size_t maximum_num_cpus = CPU_SETSIZE;
33#endif
34
35#if HI_OPERATING_SYSTEM == HI_OS_WINDOWS
36using thread_id = uint32_t;
37#else
38using thread_id = uint64_t;
41inline thread_local thread_id current_thread_id_dummy = 0;
42#endif
43
47[[nodiscard]] inline thread_id current_thread_id() noexcept
48{
49#if HI_OPERATING_SYSTEM == HI_OS_WINDOWS
50 // Thread IDs on Win32 are guaranteed to be not zero.
51 constexpr uint64_t NT_TIB_CurrentThreadID = 0x48;
52 return __readgsdword(NT_TIB_CurrentThreadID);
53#else
54 // Addresses can not be zero.
55 return reinterpret_cast<uint64_t>(&current_thread_id_dummy);
56#endif
57}
58
64[[nodiscard]] std::vector<bool> process_affinity_mask() noexcept;
65
75std::vector<bool> set_thread_affinity_mask(std::vector<bool> const &mask);
76
86std::vector<bool> set_thread_affinity(std::size_t cpu_id);
87
97std::size_t advance_thread_affinity(std::size_t &cpu) noexcept;
98
103[[nodiscard]] std::size_t current_cpu_id() noexcept;
104
105} // namespace hi::inline v1
This file includes required definitions.
Functions and macros for handling architectural difference between compilers, CPUs and operating syst...
STL namespace.