18 return unexpected(std::error_code(result, std::generic_category()));
21template <
typename SetSchedFn>
23apply_sched_params(native_scheduling_policy policy, native_thread_priority priority, SetSchedFn&& set_sched)
24 -> expected<void, std::error_code>
26 int const policy_int =
static_cast<int>(policy);
27 auto params_result = scheduler_parameters::create_for_policy(policy, priority);
28 if (!params_result.has_value())
29 return unexpected(params_result.error());
30 if (set_sched(policy_int, ¶ms_result.value()) == 0)
32 return unexpected(std::error_code(errno, std::generic_category()));
39 -> expected<void, std::error_code>
41 int const policy_int =
static_cast<int>(policy);
42 auto params_result = scheduler_parameters::create_for_policy(policy, priority);
43 if (!params_result.has_value())
44 return unexpected(params_result.error());
45 int const result = pthread_setschedparam(handle, policy_int, ¶ms_result.value());
50apply_affinity(pthread_t handle, native_thread_affinity
const& affinity) -> expected<void, std::error_code>
52 int const result = pthread_setaffinity_np(handle,
sizeof(cpu_set_t), &affinity.native_handle());
57apply_name(pthread_t handle, std::string
const& name) -> expected<void, std::error_code>
59 if (name.length() > 15)
60 return unexpected(std::make_error_code(std::errc::invalid_argument));
61 int const result = pthread_setname_np(handle, name.c_str());
64 return unexpected(std::error_code(result, std::generic_category()));
68read_name(pthread_t handle) -> expected<std::string, std::error_code>
71 int const result = pthread_getname_np(handle, name,
sizeof(name));
73 return std::string(name);
74 return unexpected(std::error_code(result, std::generic_category()));
78read_affinity(pthread_t handle) -> expected<native_thread_affinity, std::error_code>
82 int const result = pthread_getaffinity_np(handle,
sizeof(cpu_set_t), &cpuset);
84 return unexpected(std::error_code(result, std::generic_category()));
86 std::vector<int> cpus;
87 for (
int i = 0; i < CPU_SETSIZE; ++i)
89 if (CPU_ISSET(i, &cpuset))
92 return native_thread_affinity(cpus);
100 if (pthread_getschedparam(handle, &policy, ¶m) == 0)
101 return param.sched_priority;
110 if (pthread_getschedparam(handle, &policy, ¶m) == 0)
111 return static_cast<native_scheduling_policy
>(policy);
119 -> expected<void, std::error_code>
121 return apply_sched_params(policy, priority, [tid](
int p, sched_param* sp) {
return sched_setscheduler(tid, p, sp); });
127 if (nice_value < -20 || nice_value > 19)
128 return unexpected(std::make_error_code(std::errc::invalid_argument));
130 return unexpected(std::make_error_code(std::errc::no_such_process));
131 if (setpriority(PRIO_PROCESS,
static_cast<id_t
>(tid), nice_value) == 0)
133 return unexpected(std::error_code(errno, std::generic_category()));
137apply_affinity(pid_t tid, native_thread_affinity
const& affinity) -> expected<void, std::error_code>
139 if (sched_setaffinity(tid,
sizeof(cpu_set_t), &affinity.native_handle()) == 0)
141 return unexpected(std::error_code(errno, std::generic_category()));
145apply_name(pid_t tid, std::string
const& name) -> expected<void, std::error_code>
147 if (name.length() > 15)
148 return unexpected(std::make_error_code(std::errc::invalid_argument));
150 std::string
const path = std::string(
"/proc/self/task/") + std::to_string(tid) +
"/comm";
151 std::ofstream out(path);
153 return unexpected(std::error_code(errno, std::generic_category()));
158 return unexpected(std::error_code(errno, std::generic_category()));
163read_name(pid_t tid) -> expected<std::string, std::error_code>
165 std::string
const path = std::string(
"/proc/self/task/") + std::to_string(tid) +
"/comm";
166 std::ifstream in(path);
168 return unexpected(std::error_code(errno, std::generic_category()));
171 std::getline(in, current);
173 return unexpected(std::error_code(errno, std::generic_category()));
174 if (!current.empty() && current.back() ==
'\n')
180read_affinity(pid_t tid) -> expected<native_thread_affinity, std::error_code>
184 if (sched_getaffinity(tid,
sizeof(cpu_set_t), &cpuset) != 0)
185 return unexpected(std::error_code(errno, std::generic_category()));
187 std::vector<int> cpus;
188 for (
int i = 0; i < CPU_SETSIZE; ++i)
190 if (CPU_ISSET(i, &cpuset))
193 return native_thread_affinity(cpus);
200 if (sched_getparam(tid, ¶m) == 0)
201 return param.sched_priority;
209 return unexpected(std::make_error_code(std::errc::no_such_process));
211 int const value = getpriority(PRIO_PROCESS,
static_cast<id_t
>(tid));
214 return unexpected(std::error_code(errno, std::generic_category()));
220 int const policy = sched_getscheduler(tid);
223 return static_cast<native_scheduling_policy
>(policy);
auto read_scheduling_policy(pthread_t handle) -> std::optional< native_scheduling_policy >
auto pthread_call_result(int result) -> expected< void, std::error_code >
auto read_affinity(pthread_t handle) -> expected< native_thread_affinity, std::error_code >
auto apply_name(pthread_t handle, std::string const &name) -> expected< void, std::error_code >
auto apply_scheduling_policy(pthread_t handle, native_scheduling_policy policy, native_thread_priority priority) -> expected< void, std::error_code >
auto apply_nice_value(pid_t tid, int nice_value) -> expected< void, std::error_code >
auto apply_sched_params(native_scheduling_policy policy, native_thread_priority priority, SetSchedFn &&set_sched) -> expected< void, std::error_code >
auto read_priority(pthread_t handle) -> std::optional< int >
auto read_nice_value(pid_t tid) -> expected< int, std::error_code >
auto apply_affinity(pthread_t handle, native_thread_affinity const &affinity) -> expected< void, std::error_code >
auto read_name(pthread_t handle) -> expected< std::string, std::error_code >