16#include <sys/resource.h>
22inline constexpr bool ALWAYS_FALSE_V =
false;
28std::error_code
Apply(IdleScheduler
const& scheduler)
noexcept {
29 return Apply(0, scheduler);
32std::error_code
Apply(DynamicScheduler
const& scheduler)
noexcept {
33 return Apply(0, scheduler);
36std::error_code
Apply(StaticScheduler
const& scheduler)
noexcept {
37 return Apply(0, scheduler);
40std::error_code
Apply(Scheduler
const& scheduler)
noexcept {
41 return Apply(0, scheduler);
52 thread,
static_cast<int>(scheduler.GetPolicy()), 0, scheduler.GetNice());
57 thread,
static_cast<int>(scheduler.GetPolicy()), scheduler.GetPriority(), 0);
60std::error_code
Apply(pid_t thread,
Scheduler const& scheduler)
noexcept {
61 return std::visit([thread](
auto const& sched) {
return Apply(thread, sched); },
65std::ostream& operator<<(std::ostream& os,
IdleScheduler const& scheduler) {
71 if (
auto err = SetPolicy(policy); err) {
72 throw std::system_error(err);
74 if (
auto err = SetPriority(prio); err) {
75 throw std::system_error(err);
79std::error_code StaticScheduler::SetPolicy(Policy policy)
noexcept {
86 return std::make_error_code(std::errc::invalid_argument);
91std::error_code StaticScheduler::SetPriority(
int priority) {
92 if (priority < 1 || priority > 99) {
93 return std::make_error_code(std::errc::invalid_argument);
99std::ostream& operator<<(std::ostream& os, StaticScheduler::Policy
const& policy) {
101 case StaticScheduler::Policy::Rr:
104 case StaticScheduler::Policy::Fifo:
111std::ostream& operator<<(std::ostream& os, StaticScheduler
const& scheduler) {
112 os <<
"Static {policy=" << scheduler.GetPolicy() <<
", priority=" << scheduler.GetPriority()
117DynamicScheduler::DynamicScheduler(Policy policy,
int priority)
118 : m_policy(Policy::Other), m_priority(0) {
119 if (
auto err = SetPolicy(policy); err) {
120 throw std::system_error(err);
122 if (
auto err = SetNice(priority); err) {
123 throw std::system_error(err);
127std::error_code DynamicScheduler::SetNice(
int priority)
noexcept {
128 if (priority < -20 || priority > 19) {
129 return std::make_error_code(std::errc::invalid_argument);
131 m_priority = priority;
135int DynamicScheduler::GetNice() const noexcept {
139std::error_code DynamicScheduler::SetPolicy(Policy policy)
noexcept {
146 return std::make_error_code(std::errc::invalid_argument);
151std::ostream& operator<<(std::ostream& os, DynamicScheduler::Policy
const& policy) {
153 case DynamicScheduler::Policy::Other:
156 case DynamicScheduler::Policy::Batch:
163std::ostream& operator<<(std::ostream& os, DynamicScheduler
const& scheduler) {
164 os <<
"Dynamic {policy=" << scheduler.GetPolicy() <<
", nice=" << scheduler.GetNice() <<
"}";
168Scheduler::Scheduler(SchedulerVariant&& sched) noexcept : m_scheduler(sched) {
171Scheduler::Scheduler(SchedulerVariant
const& sched) : m_scheduler(sched) {
174Scheduler::Scheduler(IdleScheduler sched) noexcept
175 : m_scheduler(std::in_place_type<IdleScheduler>, sched) {
178Scheduler::Scheduler(StaticScheduler sched) noexcept
179 : m_scheduler(std::in_place_type<StaticScheduler>, sched) {
182Scheduler::Scheduler(DynamicScheduler sched) noexcept
183 : m_scheduler(std::in_place_type<DynamicScheduler>, sched) {
192Scheduler Scheduler::MakeFromActive() {
193 return MakeFromActive(0);
196Scheduler Scheduler::MakeFromActive(pid_t pid) {
200 if (
auto err = ll::GetSchedulerPolicy(pid, &policy, &static_prio, &dynamic_prio); err) {
201 throw std::system_error(err);
207 DynamicScheduler(
static_cast<DynamicScheduler::Policy
>(policy), dynamic_prio));
212 StaticScheduler(
static_cast<StaticScheduler::Policy
>(policy), static_prio));
214 return Scheduler(IdleScheduler());
216 throw std::system_error(std::make_error_code(std::errc::not_supported));
220std::ostream& operator<<(std::ostream& os, Scheduler
const& scheduler) {
222 [&](
auto const& sched) {
223 using T = std::decay_t<
decltype(sched)>;
224 if constexpr (std::is_same_v<T, IdleScheduler>) {
225 os <<
"Scheduler {IdleScheduler}";
226 }
else if constexpr (std::is_same_v<T, DynamicScheduler>) {
227 os <<
"Scheduler {" << sched <<
"}";
228 }
else if constexpr (std::is_same_v<T, StaticScheduler>) {
229 os <<
"Scheduler {" << sched <<
"}";
231 static_assert(ALWAYS_FALSE_V<T>,
"non-exhaustive visitor!");
Normal non-realtime scheduler that use dynamic priority (nice value).
Represents SCHED_IDLE scheduler policy.
A sum-type of all supported schedulers.
Static priority scheduler (real-time).
StaticScheduler(Policy policy, int priority)
Create with provided policy and priority.
std::error_code Apply(CpuAffinity const &affinity) noexcept
Apply policy to calling thread.
std::error_code Apply(pid_t thread, CpuAffinity const &affinity) noexcept
Apply policy to specified thread.
std::variant< DynamicScheduler, StaticScheduler, IdleScheduler > SchedulerVariant
Variant of possible schedulers.
Contains low-level functions.
std::error_code SetSchedulerPolicy(pid_t pid, int policy, int static_priority, int dynamic_priority) noexcept
A low-level, and error prone function to set policy.
Contains scheduler declarations.