#include #include #include #include #include #include #include "litmus.h" #include "internal.h" #define SCHED_NORMAL 0 int task_mode(int mode) { struct sched_param param; int me = gettid(); int policy = sched_getscheduler(gettid()); int old_mode = policy == SCHED_LITMUS ? LITMUS_RT_TASK : BACKGROUND_TASK; memset(¶m, 0, sizeof(param)); param.sched_priority = 0; if (old_mode == LITMUS_RT_TASK && mode == BACKGROUND_TASK) { /* transition to normal task */ return sched_setscheduler(me, SCHED_NORMAL, ¶m); } else if (old_mode == BACKGROUND_TASK && mode == LITMUS_RT_TASK) { /* transition to RT task */ return sched_setscheduler(me, SCHED_LITMUS, ¶m); } else { errno = -EINVAL; return -1; } }