109 constexpr explicit ThreadPriority(
int priority = 0) : priority_(std::clamp(priority, min_priority, max_priority))
113 [[nodiscard]]
constexpr auto value()
const noexcept ->
int
117 [[nodiscard]]
constexpr auto is_valid()
const noexcept ->
bool
119 return priority_ >= min_priority && priority_ <= max_priority;
122 [[nodiscard]]
static constexpr auto lowest()
noexcept -> ThreadPriority
124 return ThreadPriority(min_priority);
126 [[nodiscard]]
static constexpr auto normal()
noexcept -> ThreadPriority
128 return ThreadPriority(0);
130 [[nodiscard]]
static constexpr auto highest()
noexcept -> ThreadPriority
132 return ThreadPriority(max_priority);
135 [[nodiscard]]
constexpr auto operator==(ThreadPriority
const& other)
const noexcept ->
bool
137 return priority_ == other.priority_;
139 [[nodiscard]]
constexpr auto operator!=(ThreadPriority
const& other)
const noexcept ->
bool
141 return priority_ != other.priority_;
143 [[nodiscard]]
constexpr auto operator<(ThreadPriority
const& other)
const noexcept ->
bool
145 return priority_ < other.priority_;
147 [[nodiscard]]
constexpr auto operator<=(ThreadPriority
const& other)
const noexcept ->
bool
149 return priority_ <= other.priority_;
151 [[nodiscard]]
constexpr auto operator>(ThreadPriority
const& other)
const noexcept ->
bool
153 return priority_ > other.priority_;
155 [[nodiscard]]
constexpr auto operator>=(ThreadPriority
const& other)
const noexcept ->
bool
157 return priority_ >= other.priority_;
160 [[nodiscard]]
auto to_string()
const -> std::string
162 std::ostringstream oss;
163 oss <<
"ThreadPriority(" << priority_ <<
")";
168 static constexpr int min_priority = -20;
169 static constexpr int max_priority = 19;
219 explicit ThreadAffinity(std::vector<int>
const& cpus) : ThreadAffinity()
228 void add_cpu(
int cpu)
233 WORD g =
static_cast<WORD
>(cpu / 64);
244 mask_ |= (
static_cast<unsigned long long>(1) << bit);
246 if (cpu >= 0 && cpu < CPU_SETSIZE)
248 CPU_SET(cpu, &cpuset_);
253 void remove_cpu(
int cpu)
258 WORD g =
static_cast<WORD
>(cpu / 64);
262 mask_ &= ~(
static_cast<unsigned long long>(1) << bit);
265 if (cpu >= 0 && cpu < CPU_SETSIZE)
267 CPU_CLR(cpu, &cpuset_);
272 [[nodiscard]]
auto is_set(
int cpu)
const ->
bool
277 WORD g =
static_cast<WORD
>(cpu / 64);
279 return g == group_ && (mask_ & (
static_cast<unsigned long long>(1) << bit)) != 0;
281 return cpu >= 0 && cpu < CPU_SETSIZE && CPU_ISSET(cpu, &cpuset_);
285 [[nodiscard]]
auto has_cpu(
int cpu)
const ->
bool
299 [[nodiscard]]
auto get_cpus()
const -> std::vector<int>
301 std::vector<int> cpus;
303 for (
int i = 0; i < 64; ++i)
305 if (mask_ & (
static_cast<unsigned long long>(1) << i))
307 cpus.push_back(
static_cast<int>(group_) * 64 + i);
311 for (
int i = 0; i < CPU_SETSIZE; ++i)
313 if (CPU_ISSET(i, &cpuset_))
323 [[nodiscard]]
unsigned long long get_mask()
const
327 [[nodiscard]] WORD get_group()
const
331 [[nodiscard]]
bool has_any()
const
336 [[nodiscard]]
auto native_handle()
const -> cpu_set_t
const&
342 [[nodiscard]]
auto to_string()
const -> std::string
344 auto cpus = get_cpus();
345 std::ostringstream oss;
346 oss <<
"ThreadAffinity({";
347 for (
size_t i = 0; i < cpus.size(); ++i)
360 unsigned long long mask_;
405 struct sched_param_win
413 sched_param_win param{};
415 param.sched_priority = priority.value();
425 static auto create_for_policy(SchedulingPolicy policy,
ThreadPriority priority)
430 int const policy_int =
static_cast<int>(policy);
431 int const min_prio = sched_get_priority_min(policy_int);
432 int const max_prio = sched_get_priority_max(policy_int);
434 if (min_prio == -1 || max_prio == -1)
436 return unexpected(std::make_error_code(std::errc::invalid_argument));
439 param.sched_priority = std::clamp(priority.value(), min_prio, max_prio);
445 int const policy_int =
static_cast<int>(policy);
446 int const min_prio = sched_get_priority_min(policy_int);
447 int const max_prio = sched_get_priority_max(policy_int);
449 if (min_prio == -1 || max_prio == -1)
451 return unexpected(std::make_error_code(std::errc::invalid_argument));
454 return max_prio - min_prio;