libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
basicthread.h
Go to the documentation of this file.
1
8#pragma once
9
10#include <promeki/config.h>
11#if PROMEKI_ENABLE_CORE
12#include <chrono>
13#include <thread>
14#include <promeki/atomic.h>
15#include <promeki/duration.h>
16#include <promeki/error.h>
17#include <promeki/function.h>
18#include <promeki/set.h>
19#include <promeki/string.h>
20#include <promeki/uniqueptr.h>
21
22PROMEKI_NAMESPACE_BEGIN
23
31enum class SchedulePolicy {
32 Default,
33 RoundRobin,
34 Fifo,
35 Batch,
36 Idle
37};
38
70class BasicThread {
71 public:
73 using NativeHandle = std::thread::native_handle_type;
74
76 using Entry = Function<void()>;
77
87 static uint64_t currentNativeId();
88
99 static void setCurrentThreadName(const String &name);
100
106 static int priorityMin(SchedulePolicy policy = SchedulePolicy::Default);
107
113 static int priorityMax(SchedulePolicy policy = SchedulePolicy::Default);
114
123 static unsigned int idealThreadCount();
124
133 static void sleepNs(int64_t ns);
134
139 static void sleepUs(int64_t us);
140
145 static void sleepMs(int64_t ms);
146
154 static void sleep(const Duration &d) { sleepNs(d.nanoseconds()); }
155
162 static void yield();
163
165 BasicThread();
166
174 explicit BasicThread(const String &name);
175
177 BasicThread(BasicThread &&other) noexcept;
178
183 BasicThread &operator=(BasicThread &&other) noexcept;
184
185 BasicThread(const BasicThread &) = delete;
186 BasicThread &operator=(const BasicThread &) = delete;
187
189 ~BasicThread();
190
208 Error start(Entry entry, size_t stackSize = 0);
209
220 Error join();
221
223 bool isJoinable() const;
224
226 bool isRunning() const;
227
229 bool isCurrentThread() const;
230
235 String name() const;
236
263 void setName(const String &name);
264
273 NativeHandle nativeHandle() const;
274
283 uint64_t nativeId() const;
284
293 std::thread::id id() const;
294
303 SchedulePolicy schedulePolicy() const;
304
313 int priority() const;
314
327 Error setPriority(int prio, SchedulePolicy policy = SchedulePolicy::Default);
328
338 Set<int> affinity() const;
339
353 Error setAffinity(const Set<int> &cpus);
354
355 private:
356 struct Data;
357 UniquePtr<Data> d;
358};
359
385template <typename Tag> int nextInstanceId() {
386 static Atomic<int> counter{0};
387 return counter.fetchAndAdd(1);
388}
389
390PROMEKI_NAMESPACE_END
391
392#endif // PROMEKI_ENABLE_CORE