10#include <promeki/config.h>
11#if PROMEKI_ENABLE_CORE
22PROMEKI_NAMESPACE_BEGIN
31enum class SchedulePolicy {
73 using NativeHandle = std::thread::native_handle_type;
76 using Entry = Function<void()>;
87 static uint64_t currentNativeId();
99 static void setCurrentThreadName(
const String &name);
106 static int priorityMin(SchedulePolicy policy = SchedulePolicy::Default);
113 static int priorityMax(SchedulePolicy policy = SchedulePolicy::Default);
123 static unsigned int idealThreadCount();
133 static void sleepNs(int64_t ns);
139 static void sleepUs(int64_t us);
145 static void sleepMs(int64_t ms);
154 static void sleep(
const Duration &d) { sleepNs(d.nanoseconds()); }
174 explicit BasicThread(
const String &name);
177 BasicThread(BasicThread &&other)
noexcept;
183 BasicThread &operator=(BasicThread &&other)
noexcept;
185 BasicThread(
const BasicThread &) =
delete;
186 BasicThread &operator=(
const BasicThread &) =
delete;
208 Error start(Entry entry,
size_t stackSize = 0);
223 bool isJoinable()
const;
226 bool isRunning()
const;
229 bool isCurrentThread()
const;
263 void setName(
const String &name);
273 NativeHandle nativeHandle()
const;
283 uint64_t nativeId()
const;
293 std::thread::id id()
const;
303 SchedulePolicy schedulePolicy()
const;
313 int priority()
const;
327 Error setPriority(
int prio, SchedulePolicy policy = SchedulePolicy::Default);
338 Set<int> affinity()
const;
353 Error setAffinity(
const Set<int> &cpus);
385template <
typename Tag>
int nextInstanceId() {
386 static Atomic<int> counter{0};
387 return counter.fetchAndAdd(1);