From: Philippe Gerum <r...@xenomai.org> Signed-off-by: Philippe Gerum <r...@xenomai.org> Signed-off-by: Jan Kiszka <jan.kis...@siemens.com> --- lib/alchemy/task.c | 9 ++++++--- lib/copperplate/threadobj.c | 9 ++++++--- lib/psos/task.c | 9 ++++++--- lib/vxworks/kernLib.c | 6 ++++-- lib/vxworks/taskLib.c | 6 ++++-- 5 files changed, 26 insertions(+), 13 deletions(-)
diff --git a/lib/alchemy/task.c b/lib/alchemy/task.c index 949a996d00..9afa2af579 100644 --- a/lib/alchemy/task.c +++ b/lib/alchemy/task.c @@ -1410,11 +1410,14 @@ int rt_task_slice(RT_TASK *task, RTIME quantum) param_ex.sched_priority = threadobj_get_priority(&tcb->thobj); if (quantum) { + struct timespec ts; policy = SCHED_RR; - clockobj_ticks_to_timespec(&alchemy_clock, quantum, - ¶m_ex.sched_rr_quantum); - } else + clockobj_ticks_to_timespec(&alchemy_clock, quantum, &ts); + param_ex.sched_rr_quantum.tv_sec = ts.tv_sec; + param_ex.sched_rr_quantum.tv_nsec = ts.tv_nsec; + } else { policy = param_ex.sched_priority ? SCHED_FIFO : SCHED_OTHER; + } ret = threadobj_set_schedparam(&tcb->thobj, policy, ¶m_ex); switch (ret) { diff --git a/lib/copperplate/threadobj.c b/lib/copperplate/threadobj.c index a3101baa15..f4588a17a8 100644 --- a/lib/copperplate/threadobj.c +++ b/lib/copperplate/threadobj.c @@ -1741,7 +1741,8 @@ int threadobj_set_schedparam(struct threadobj *thobj, int policy, ret = enable_rr_corespec(thobj, param_ex); if (ret) return __bt(ret); - thobj->tslice = param_ex->sched_rr_quantum; + thobj->tslice.tv_sec = param_ex->sched_rr_quantum.tv_sec; + thobj->tslice.tv_nsec = param_ex->sched_rr_quantum.tv_nsec; } else if (thobj->policy == SCHED_RR) /* Switching off round-robin. */ disable_rr_corespec(thobj); @@ -1761,8 +1762,10 @@ int threadobj_set_schedprio(struct threadobj *thobj, int priority) param_ex.sched_priority = priority; policy = thobj->policy; - if (policy == SCHED_RR) - param_ex.sched_rr_quantum = thobj->tslice; + if (policy == SCHED_RR) { + param_ex.sched_rr_quantum.tv_sec = thobj->tslice.tv_sec; + param_ex.sched_rr_quantum.tv_nsec = thobj->tslice.tv_nsec; + } return threadobj_set_schedparam(thobj, policy, ¶m_ex); } diff --git a/lib/psos/task.c b/lib/psos/task.c index 46e49ea888..f678be61d1 100644 --- a/lib/psos/task.c +++ b/lib/psos/task.c @@ -192,7 +192,8 @@ static void *task_trampoline(void *arg) if (task->mode & T_TSLICE) { param_ex.sched_priority = threadobj_get_priority(&task->thobj); - param_ex.sched_rr_quantum = psos_rrperiod; + param_ex.sched_rr_quantum.tv_sec = psos_rrperiod.tv_sec; + param_ex.sched_rr_quantum.tv_nsec = psos_rrperiod.tv_nsec; threadobj_set_schedparam(&task->thobj, SCHED_RR, ¶m_ex); } @@ -630,9 +631,11 @@ u_long t_mode(u_long mask, u_long newmask, u_long *oldmode_r) if (task->mode & T_TSLICE) { policy = SCHED_RR; - param_ex.sched_rr_quantum = psos_rrperiod; - } else + param_ex.sched_rr_quantum.tv_sec = psos_rrperiod.tv_sec; + param_ex.sched_rr_quantum.tv_nsec = psos_rrperiod.tv_nsec; + } else { policy = param_ex.sched_priority ? SCHED_FIFO : SCHED_OTHER; + } /* Working on self, so -EIDRM can't happen. */ threadobj_set_schedparam(&task->thobj, policy, ¶m_ex); diff --git a/lib/vxworks/kernLib.c b/lib/vxworks/kernLib.c index 4f3bd82015..d67502730d 100644 --- a/lib/vxworks/kernLib.c +++ b/lib/vxworks/kernLib.c @@ -30,9 +30,11 @@ static int switch_slicing(struct threadobj *thobj, struct timespec *quantum) if (quantum) { policy = SCHED_RR; - param_ex.sched_rr_quantum = *quantum; - } else + param_ex.sched_rr_quantum.tv_sec = quantum->tv_sec; + param_ex.sched_rr_quantum.tv_nsec = quantum->tv_nsec; + } else { policy = param_ex.sched_priority ? SCHED_FIFO : SCHED_OTHER; + } return threadobj_set_schedparam(thobj, policy, ¶m_ex); } diff --git a/lib/vxworks/taskLib.c b/lib/vxworks/taskLib.c index a4af36c1f9..c8723c6be6 100644 --- a/lib/vxworks/taskLib.c +++ b/lib/vxworks/taskLib.c @@ -265,8 +265,10 @@ static void *task_trampoline(void *arg) /* Turn on time slicing if RR globally enabled. */ if (wind_time_slice) { - clockobj_ticks_to_timespec(&wind_clock, wind_time_slice, - ¶m_ex.sched_rr_quantum); + struct timespec ts; + clockobj_ticks_to_timespec(&wind_clock, wind_time_slice, &ts); + param_ex.sched_rr_quantum.tv_sec = ts.tv_sec; + param_ex.sched_rr_quantum.tv_nsec = ts.tv_nsec; threadobj_lock(&task->thobj); param_ex.sched_priority = threadobj_get_priority(&task->thobj); threadobj_set_schedparam(&task->thobj, SCHED_RR, ¶m_ex); -- 2.26.2