diff --git a/src/realtime.c b/src/realtime.c new file mode 100644 index 00000000..cb3ffd46 --- /dev/null +++ b/src/realtime.c @@ -0,0 +1,37 @@ +#include +#include +#include +#include +#include "labwc.h" + +static void child_fork_callback(void) { + + struct sched_param param; + param.sched_priority = 0; + int ret = pthread_setschedparam(pthread_self(), SCHED_OTHER, ¶m); + if (ret != 0) { + wlr_log(WLR_ERROR, "Failed to reset scheduler policy on fork"); + } +} + +void set_rr_scheduling(void) { + int prio = sched_get_priority_min(SCHED_RR); + int old_policy; + int ret; + struct sched_param param; + ret = pthread_getschedparam(pthread_self(), &old_policy, ¶m); + if (ret != 0) { + wlr_log(WLR_DEBUG, "Failed to get old scheduling priority"); + return; + } + + param.sched_priority = prio; + ret = pthread_setschedparam(pthread_self(), SCHED_RR, ¶m); + + if (ret != 0) { + wlr_log(WLR_INFO, "Failed to set scheduling priority to %d", prio); + return; + } + + pthread_atfork(NULL, NULL, child_fork_callback); +}