13#include "concepts.hpp"
14#include "scheduler_policy.hpp"
15#include "thread_pool.hpp"
16#include "thread_registry.hpp"
20namespace threadschedule
29 SchedulingPolicy policy;
31 std::optional<ThreadAffinity> affinity;
44 SchedulingPolicy::OTHER,
46 SchedulingPolicy::FIFO,
48 ThreadPriority::highest(), std::nullopt};
64 return ThreadProfile{
"throughput", SchedulingPolicy::BATCH, ThreadPriority::normal(), std::nullopt};
72 return ThreadProfile{
"background", SchedulingPolicy::IDLE, ThreadPriority::lowest(), std::nullopt};
79template <
typename ThreadLike, std::enable_if_t<is_thread_like_v<ThreadLike>,
int> = 0>
83 if (!t.set_scheduling_policy(p.policy, p.priority).has_value())
85 if (p.affinity.has_value())
87 if (!t.set_affinity(*p.affinity).has_value())
92 return unexpected(std::make_error_code(std::errc::operation_not_permitted));
101 if (!t.set_scheduling_policy(p.policy, p.priority).has_value())
103 if (p.affinity.has_value())
105 if (!t.set_affinity(*p.affinity).has_value())
110 return unexpected(std::make_error_code(std::errc::operation_not_permitted));
128 if (!pool.configure_threads(
"pool", p.policy, p.priority))
130 if (p.affinity.has_value())
132 if (!pool.set_affinity(*p.affinity))
137 return unexpected(std::make_error_code(std::errc::operation_not_permitted));
146 if (!pool.configure_threads(
"hp", p.policy, p.priority).has_value())
148 if (p.affinity.has_value())
150 if (!pool.set_affinity(*p.affinity).has_value())
155 return unexpected(std::make_error_code(std::errc::operation_not_permitted));
164 if (!reg.set_scheduling_policy(tid, p.policy, p.priority).has_value())
166 if (p.affinity.has_value())
168 if (!reg.set_affinity(tid, *p.affinity).has_value())
173 return unexpected(std::make_error_code(std::errc::operation_not_permitted));
Simple thread pool for general-purpose use.
Thread priority wrapper with validation.
auto apply_profile(ThreadLike &t, ThreadProfile const &p) -> expected< void, std::error_code >
Apply a profile to a single thread wrapper or view.
auto throughput() -> ThreadProfile
Throughput-oriented profile favoring batch scheduling.
auto background() -> ThreadProfile
Background profile for very low priority work.
auto low_latency() -> ThreadProfile
Low-latency interactive profile using RR scheduling.
auto realtime() -> ThreadProfile
Highest priority profile. Uses FIFO on Linux (if permitted), falls back to OTHER on Windows.
Declarative profile describing desired scheduling.