This second patch extends xnpod_suspend_thread and xnsynch_sleep_on by a timeout mode parameter to specify both relative and absolute timeouts on thread suspension.
All callers of the involved services are at least adapted to the interface change. Most callers that formerly converted absolute to relative timeouts now no longer do this - except for the POSIX skin which requires more refactoring. I'm now scratching my head, because there was something more I wanted to remark here. But I forgot to write it down when I hacked the patch, damn. Anyway, the patch is tested lightly and seems to include only well hidden regressions. What remains to be done is an evaluation of what we may gain (speed for some scenarios) vs. what we may loose (speed in some other scenarios, code size). Jan
--- include/nucleus/pod.h | 5 ++- include/nucleus/synch.h | 3 -- ksrc/drivers/testing/switchtest.c | 4 +- ksrc/nucleus/pipe.c | 3 +- ksrc/nucleus/pod.c | 45 +++++++++++++++++++----------- ksrc/nucleus/registry.c | 6 ++-- ksrc/nucleus/shadow.c | 13 +++++++- ksrc/nucleus/synch.c | 24 ++++++++++------ ksrc/skins/native/cond.c | 2 - ksrc/skins/native/event.c | 2 - ksrc/skins/native/heap.c | 2 - ksrc/skins/native/mutex.c | 2 - ksrc/skins/native/queue.c | 2 - ksrc/skins/native/sem.c | 2 - ksrc/skins/native/syscall.c | 4 +- ksrc/skins/native/task.c | 18 +++++------- ksrc/skins/posix/clock.c | 3 +- ksrc/skins/posix/cond.c | 2 - ksrc/skins/posix/mq.c | 4 +- ksrc/skins/posix/mutex.c | 2 - ksrc/skins/posix/mutex.h | 2 - ksrc/skins/posix/registry.c | 3 +- ksrc/skins/posix/sem.c | 2 - ksrc/skins/posix/signal.c | 3 +- ksrc/skins/posix/syscall.c | 2 - ksrc/skins/posix/thread.c | 3 +- ksrc/skins/psos+/event.c | 2 - ksrc/skins/psos+/queue.c | 2 - ksrc/skins/psos+/rn.c | 2 - ksrc/skins/psos+/sem.c | 2 - ksrc/skins/psos+/task.c | 3 +- ksrc/skins/rtdm/drvlib.c | 56 +++++++++++--------------------------- ksrc/skins/uitron/flag.c | 2 - ksrc/skins/uitron/mbx.c | 2 - ksrc/skins/uitron/sem.c | 2 - ksrc/skins/uitron/task.c | 15 ++++++---- ksrc/skins/vrtx/event.c | 2 - ksrc/skins/vrtx/mb.c | 2 - ksrc/skins/vrtx/mx.c | 2 - ksrc/skins/vrtx/queue.c | 2 - ksrc/skins/vrtx/sem.c | 2 - ksrc/skins/vrtx/task.c | 6 ++-- ksrc/skins/vxworks/msgQLib.c | 6 ++-- ksrc/skins/vxworks/semLib.c | 4 +- ksrc/skins/vxworks/syscall.c | 2 - ksrc/skins/vxworks/taskLib.c | 6 ++-- 46 files changed, 152 insertions(+), 133 deletions(-) Index: xenomai/include/nucleus/pod.h =================================================================== --- xenomai.orig/include/nucleus/pod.h +++ xenomai/include/nucleus/pod.h @@ -454,6 +454,7 @@ xnflags_t xnpod_set_thread_mode(xnthread void xnpod_suspend_thread(xnthread_t *thread, xnflags_t mask, xnticks_t timeout, + int timeout_mode, struct xnsynch *resource); void xnpod_resume_thread(xnthread_t *thread, @@ -536,12 +537,12 @@ static inline void xnpod_yield (void) static inline void xnpod_delay (xnticks_t timeout) { - xnpod_suspend_thread(xnpod_current_thread(),XNDELAY,timeout,NULL); + xnpod_suspend_thread(xnpod_current_thread(),XNDELAY,timeout,XNTIMER_RELATIVE,NULL); } static inline void xnpod_suspend_self (void) { - xnpod_suspend_thread(xnpod_current_thread(),XNSUSP,XN_INFINITE,NULL); + xnpod_suspend_thread(xnpod_current_thread(),XNSUSP,XN_INFINITE,XNTIMER_RELATIVE,NULL); } static inline void xnpod_delete_self (void) Index: xenomai/include/nucleus/synch.h =================================================================== --- xenomai.orig/include/nucleus/synch.h +++ xenomai/include/nucleus/synch.h @@ -100,8 +100,7 @@ static inline void xnsynch_register_clea synch->cleanup = handler; } -void xnsynch_sleep_on(xnsynch_t *synch, - xnticks_t timeout); +void xnsynch_sleep_on(xnsynch_t *synch, xnticks_t timeout, int timeout_mode); struct xnthread *xnsynch_wakeup_one_sleeper(xnsynch_t *synch); Index: xenomai/ksrc/drivers/testing/switchtest.c =================================================================== --- xenomai.orig/ksrc/drivers/testing/switchtest.c +++ xenomai/ksrc/drivers/testing/switchtest.c @@ -50,7 +50,7 @@ static int rtswitch_pend_rt(rtswitch_con task = &ctx->tasks[idx]; task->base.flags |= RTSWITCH_RT; - xnsynch_sleep_on(&task->rt_synch, XN_INFINITE); + xnsynch_sleep_on(&task->rt_synch, XN_INFINITE, XNTIMER_RELATIVE); if (xnthread_test_flags(xnpod_current_thread(), XNBREAK)) return -EINTR; @@ -99,7 +99,7 @@ static int rtswitch_to_rt(rtswitch_conte return -EINVAL; } - xnsynch_sleep_on(&from->rt_synch, XN_INFINITE); + xnsynch_sleep_on(&from->rt_synch, XN_INFINITE, XNTIMER_RELATIVE); xnlock_put_irqrestore(&nklock, s); Index: xenomai/ksrc/nucleus/pipe.c =================================================================== --- xenomai.orig/ksrc/nucleus/pipe.c +++ xenomai/ksrc/nucleus/pipe.c @@ -432,7 +432,8 @@ ssize_t xnpipe_recv(int minor, struct xn goto unlock_and_exit; } - xnsynch_sleep_on(&state->synchbase, timeout); + xnsynch_sleep_on(&state->synchbase, timeout, + XNTIMER_RELATIVE); thread = xnpod_current_thread(); Index: xenomai/ksrc/nucleus/pod.c =================================================================== --- xenomai.orig/ksrc/nucleus/pod.c +++ xenomai/ksrc/nucleus/pod.c @@ -180,7 +180,8 @@ static int xnpod_fault_handler(xnarch_fl thread, thread->name, xnarch_fault_pc(fltinfo), xnarch_fault_trap(fltinfo)); - xnpod_suspend_thread(thread, XNSUSP, XN_INFINITE, NULL); + xnpod_suspend_thread(thread, XNSUSP, XN_INFINITE, + XNTIMER_RELATIVE, NULL); return 1; } @@ -819,7 +820,7 @@ int xnpod_init_thread(xnthread_t *thread appendq(&nkpod->threadq, &thread->glink); nkpod->threadq_rev++; xnpod_suspend_thread(thread, XNDORMANT | (flags & XNSUSP), XN_INFINITE, - NULL); + XNTIMER_RELATIVE, NULL); xnlock_put_irqrestore(&nklock, s); return 0; @@ -1289,7 +1290,9 @@ void xnpod_delete_thread(xnthread_t *thr } /*! - * \fn void xnpod_suspend_thread(xnthread_t *thread,xnflags_t mask,xnticks_t timeout,xnsynch_t *wchan) + * \fn void xnpod_suspend_thread(xnthread_t *thread,xnflags_t mask, + * xnticks_t timeout,int timeout_mode, + * xnsynch_t *wchan) * * \brief Suspend a thread. * @@ -1320,12 +1323,17 @@ void xnpod_delete_thread(xnthread_t *thr * through the xnsynch_sleep_on() call. * * @param timeout The timeout which may be used to limit the time the - * thread pends for a resource. This value is a wait time given in - * ticks (see note). Passing XN_INFINITE specifies an unbounded - * wait. All other values are used to initialize a watchdog timer. If - * the current operation mode is oneshot and @a timeout elapses before - * xnpod_suspend_thread() has completed, then the target thread will - * not be suspended, and this routine leads to a null effect. + * thread pends on a resource. This value is a wait time given in + * ticks (see note). It can either be relative or absolute dependent on + * @a timeout_mode. Passing XN_INFINITE @b and setting @a timeout_mode + * to XNTIMER_RELATIVE specifies an unbounded wait. All other values are + * used to initialize a watchdog timer. If the cusrrent operation mode + * of the system timer is oneshot and @a timeout elapses before + * xnpod_suspend_thread() has completed, then the target thread will not + * be suspended, and this routine leads to a null effect. + * + * @param timeout_mode The mode of the @a timeout parameter. It can either + * be set to XNTIMER_RELATIVE or XNTIMER_ABSOLUTE. * * @param wchan The address of a pended resource. This parameter is * used internally by the synchronization object implementation code @@ -1356,7 +1364,8 @@ void xnpod_delete_thread(xnthread_t *thr */ void xnpod_suspend_thread(xnthread_t *thread, - xnflags_t mask, xnticks_t timeout, xnsynch_t *wchan) + xnflags_t mask, xnticks_t timeout, int timeout_mode, + xnsynch_t *wchan) { xnsched_t *sched; spl_t s; @@ -1372,7 +1381,8 @@ void xnpod_suspend_thread(xnthread_t *th xnlock_get_irqsave(&nklock, s); - xnltt_log_event(xeno_ev_thrsuspend, thread->name, mask, timeout, wchan); + xnltt_log_event(xeno_ev_thrsuspend, thread->name, mask, timeout, + timeout_mode, wchan); sched = thread->sched; @@ -1424,13 +1434,14 @@ void xnpod_suspend_thread(xnthread_t *th __setbits(thread->status, mask); - if (timeout != XN_INFINITE) { + if (timeout != XN_INFINITE || timeout_mode == XNTIMER_ABSOLUTE) { /* Don't start the timer for a thread indefinitely delayed by - a call to xnpod_suspend_thread(thread,XNDELAY,0,NULL). */ + a call to xnpod_suspend_thread(thread,XNDELAY,XN_INFINITE, + XNTIMER_RELATIVE,NULL). */ __setbits(thread->status, XNDELAY); xntimer_set_sched(&thread->rtimer, thread->sched); xntimer_start(&thread->rtimer, timeout, XN_INFINITE, - XNTIMER_RELATIVE); + timeout_mode); } #ifdef __XENO_SIM__ if (nkpod->schedhook) @@ -3266,7 +3277,7 @@ int xnpod_announce_tick(xnintr_t *intr) ("watchdog triggered -- suspending runaway thread '%s'\n", xnpod_current_thread()->name); xnpod_suspend_thread(xnpod_current_thread(), XNSUSP, - XN_INFINITE, NULL); + XN_INFINITE, XNTIMER_RELATIVE, NULL); } else { xnpod_reset_watchdog(sched); } @@ -3406,7 +3417,7 @@ int xnpod_set_thread_periodic(xnthread_t xntimer_get_raw_expiry(&thread->ptimer) + xntimer_interval(&thread->ptimer); xnpod_suspend_thread(thread, XNDELAY, XN_INFINITE, - NULL); + XNTIMER_RELATIVE, NULL); } else err = -ETIMEDOUT; } @@ -3482,7 +3493,7 @@ int xnpod_wait_thread_period(unsigned lo now = xntimer_get_rawclock(); /* Work with either TSC or periodic ticks. */ if (likely(now < thread->pexpect)) { - xnpod_suspend_thread(thread, XNDELAY, XN_INFINITE, NULL); + xnpod_suspend_thread(thread, XNDELAY, XN_INFINITE, XNTIMER_RELATIVE, NULL); if (unlikely(xnthread_test_flags(thread, XNBREAK))) { err = -EINTR; Index: xenomai/ksrc/nucleus/registry.c =================================================================== --- xenomai.orig/ksrc/nucleus/registry.c +++ xenomai/ksrc/nucleus/registry.c @@ -727,7 +727,8 @@ int xnregistry_bind(const char *key, xnt thread = xnpod_current_thread(); thread->registry.waitkey = key; - xnsynch_sleep_on(®istry_hash_synch, timeout); + xnsynch_sleep_on(®istry_hash_synch, timeout, + XNTIMER_RELATIVE); if (xnthread_test_flags(thread, XNTIMEO)) { err = -ETIMEDOUT; @@ -915,7 +916,8 @@ int xnregistry_remove_safe(xnhandle_t ha cstamp = object->cstamp; do { - xnsynch_sleep_on(&object->safesynch, timeout); + xnsynch_sleep_on(&object->safesynch, timeout, + XNTIMER_RELATIVE); if (xnthread_test_flags(xnpod_current_thread(), XNBREAK)) { err = -EINTR; Index: xenomai/ksrc/nucleus/shadow.c =================================================================== --- xenomai.orig/ksrc/nucleus/shadow.c +++ xenomai/ksrc/nucleus/shadow.c @@ -719,7 +719,8 @@ void xnshadow_relax(int notify) xnpod_renice_root(XNPOD_ROOT_PRIO_BASE); #endif /* CONFIG_XENO_OPT_RPIDISABLE */ - xnpod_suspend_thread(thread, XNRELAX, XN_INFINITE, NULL); + xnpod_suspend_thread(thread, XNRELAX, XN_INFINITE, + XNTIMER_RELATIVE, NULL); splexit(s); @@ -845,7 +846,8 @@ int xnshadow_map(xnthread_t *thread, xnc MAX_RT_PRIO ? xnthread_base_priority(thread) : MAX_RT_PRIO - 1; set_linux_task_priority(current, prio); xnshadow_thrptd(current) = thread; - xnpod_suspend_thread(thread, XNRELAX, XN_INFINITE, NULL); + xnpod_suspend_thread(thread, XNRELAX, XN_INFINITE, + XNTIMER_RELATIVE, NULL); if (u_completion) { xnshadow_signal_completion(u_completion, 0); @@ -1026,6 +1028,13 @@ static int xnshadow_sys_migrate(struct t if (testbits(xnshadow_thread(curr)->status, XNDORMANT)) return 0; + /* Paranoid: a corner case where the + user-space side fiddles with SIGCHLD while + the target thread is still waiting to be + started. */ + if (testbits(xnshadow_thread(curr)->status, XNDORMANT)) + return 0; + return xnshadow_harden()? : 1; } else return 0; Index: xenomai/ksrc/nucleus/synch.c =================================================================== --- xenomai.orig/ksrc/nucleus/synch.c +++ xenomai/ksrc/nucleus/synch.c @@ -127,7 +127,7 @@ static inline void xnsynch_renice_thread } /*! - * \fn void xnsynch_sleep_on(xnsynch_t *synch,xnticks_t timeout) + * \fn void xnsynch_sleep_on(xnsynch_t *synch,xnticks_t timeout,int timeout_mode) * \brief Sleep on a synchronization object. * * Makes the calling thread sleep on the specified synchronization @@ -140,9 +140,14 @@ static inline void xnsynch_renice_thread * to sleep on. * * @param timeout The timeout which may be used to limit the time the - * thread pends on the resource. This value is a count of ticks (see - * note). Passing XN_INFINITE specifies an unbounded wait. All other - * values are used to initialize a nucleus watchdog timer. + * thread pends on the resource. This value is a wait time given in + * ticks (see note). It can either be relative or absolute dependent on + * @a timeout_mode. Passing XN_INFINITE @b and setting @a timeout_mode + * to XNTIMER_RELATIVE specifies an unbounded wait. All other values are + * used to initialize a watchdog timer. + * + * @param timeout_mode The mode of the @a timeout parameter. It can either + * be set to XNTIMER_RELATIVE or XNTIMER_ABSOLUTE. * * Environments: * @@ -160,7 +165,7 @@ static inline void xnsynch_renice_thread * oneshot mode, clock ticks are interpreted as nanoseconds. */ -void xnsynch_sleep_on(xnsynch_t *synch, xnticks_t timeout) +void xnsynch_sleep_on(xnsynch_t *synch, xnticks_t timeout, int timeout_mode) { xnthread_t *thread = xnpod_current_thread(), *owner; spl_t s; @@ -207,13 +212,14 @@ void xnsynch_sleep_on(xnsynch_t *synch, insertpqf(&synch->pendq, &thread->plink, thread->cprio); - xnpod_suspend_thread(thread, XNPEND, timeout, synch); + xnpod_suspend_thread(thread, XNPEND, timeout, + timeout_mode, synch); if (unlikely(synch->owner != thread)) { /* Somebody stole us the ownership while we were ready to run, waiting for the CPU: we need to wait again for the resource. */ - if (timeout == XN_INFINITE) + if (timeout == XN_INFINITE || timeout_mode == XNTIMER_ABSOLUTE) goto redo; timeout = xnthread_timeout(thread); if (timeout > 1) /* Otherwise, it's too late, time elapsed. */ @@ -223,11 +229,11 @@ void xnsynch_sleep_on(xnsynch_t *synch, } } else { insertpqf(&synch->pendq, &thread->plink, thread->cprio); - xnpod_suspend_thread(thread, XNPEND, timeout, synch); + xnpod_suspend_thread(thread, XNPEND, timeout, timeout_mode, synch); } } else { /* otherwise FIFO */ appendpq(&synch->pendq, &thread->plink); - xnpod_suspend_thread(thread, XNPEND, timeout, synch); + xnpod_suspend_thread(thread, XNPEND, timeout, timeout_mode, synch); } grab_ownership: Index: xenomai/ksrc/skins/native/cond.c =================================================================== --- xenomai.orig/ksrc/skins/native/cond.c +++ xenomai/ksrc/skins/native/cond.c @@ -452,7 +452,7 @@ int rt_cond_wait(RT_COND *cond, RT_MUTEX task = xeno_current_task(); - xnsynch_sleep_on(&cond->synch_base, timeout); + xnsynch_sleep_on(&cond->synch_base, timeout, XNTIMER_RELATIVE); if (xnthread_test_flags(&task->thread_base, XNRMID)) err = -EIDRM; /* Condvar deleted while pending. */ Index: xenomai/ksrc/skins/native/event.c =================================================================== --- xenomai.orig/ksrc/skins/native/event.c +++ xenomai/ksrc/skins/native/event.c @@ -495,7 +495,7 @@ int rt_event_wait(RT_EVENT *event, task = xeno_current_task(); task->wait_args.event.mode = mode; task->wait_args.event.mask = mask; - xnsynch_sleep_on(&event->synch_base, timeout); + xnsynch_sleep_on(&event->synch_base, timeout, XNTIMER_RELATIVE); /* The returned mask is only significant if the operation has succeeded, but do always write it back anyway. */ *mask_r = task->wait_args.event.mask; Index: xenomai/ksrc/skins/native/heap.c =================================================================== --- xenomai.orig/ksrc/skins/native/heap.c +++ xenomai/ksrc/skins/native/heap.c @@ -543,7 +543,7 @@ int rt_heap_alloc(RT_HEAP *heap, size_t task = xeno_current_task(); task->wait_args.heap.size = size; task->wait_args.heap.block = NULL; - xnsynch_sleep_on(&heap->synch_base, timeout); + xnsynch_sleep_on(&heap->synch_base, timeout, XNTIMER_RELATIVE); if (xnthread_test_flags(&task->thread_base, XNRMID)) err = -EIDRM; /* Heap deleted while pending. */ Index: xenomai/ksrc/skins/native/mutex.c =================================================================== --- xenomai.orig/ksrc/skins/native/mutex.c +++ xenomai/ksrc/skins/native/mutex.c @@ -375,7 +375,7 @@ int rt_mutex_lock(RT_MUTEX *mutex, RTIME goto unlock_and_exit; } - xnsynch_sleep_on(&mutex->synch_base, timeout); + xnsynch_sleep_on(&mutex->synch_base, timeout, XNTIMER_RELATIVE); if (xnthread_test_flags(&task->thread_base, XNRMID)) err = -EIDRM; /* Mutex deleted while pending. */ Index: xenomai/ksrc/skins/native/queue.c =================================================================== --- xenomai.orig/ksrc/skins/native/queue.c +++ xenomai/ksrc/skins/native/queue.c @@ -813,7 +813,7 @@ ssize_t rt_queue_receive(RT_QUEUE *q, vo goto unlock_and_exit; } - xnsynch_sleep_on(&q->synch_base, timeout); + xnsynch_sleep_on(&q->synch_base, timeout, XNTIMER_RELATIVE); task = xeno_current_task(); Index: xenomai/ksrc/skins/native/sem.c =================================================================== --- xenomai.orig/ksrc/skins/native/sem.c +++ xenomai/ksrc/skins/native/sem.c @@ -377,7 +377,7 @@ int rt_sem_p(RT_SEM *sem, RTIME timeout) else { RT_TASK *task = xeno_current_task(); - xnsynch_sleep_on(&sem->synch_base, timeout); + xnsynch_sleep_on(&sem->synch_base, timeout, XNTIMER_RELATIVE); if (xnthread_test_flags(&task->thread_base, XNRMID)) err = -EIDRM; /* Semaphore deleted while pending. */ Index: xenomai/ksrc/skins/native/syscall.c =================================================================== --- xenomai.orig/ksrc/skins/native/syscall.c +++ xenomai/ksrc/skins/native/syscall.c @@ -2976,7 +2976,7 @@ static int __rt_alarm_wait(struct task_s /* Renice the waiter above all regular tasks if needed. */ xnpod_renice_thread(&task->thread_base, XNCORE_IRQ_PRIO); - xnsynch_sleep_on(&alarm->synch_base, XN_INFINITE); + xnsynch_sleep_on(&alarm->synch_base, XN_INFINITE, XNTIMER_RELATIVE); if (xnthread_test_flags(&task->thread_base, XNRMID)) err = -EIDRM; /* Alarm deleted while pending. */ @@ -3219,7 +3219,7 @@ static int __rt_intr_wait(struct task_st xnpod_renice_thread(&task->thread_base, XNCORE_IRQ_PRIO); - xnsynch_sleep_on(&intr->synch_base, timeout); + xnsynch_sleep_on(&intr->synch_base, timeout, XNTIMER_RELATIVE); if (xnthread_test_flags(&task->thread_base, XNRMID)) err = -EIDRM; /* Interrupt object deleted while pending. */ Index: xenomai/ksrc/skins/native/task.c =================================================================== --- xenomai.orig/ksrc/skins/native/task.c +++ xenomai/ksrc/skins/native/task.c @@ -111,7 +111,8 @@ int __native_task_safewait(RT_TASK *task cstamp = task->cstamp; do { - xnsynch_sleep_on(&task->safesynch, TM_INFINITE); + xnsynch_sleep_on(&task->safesynch, TM_INFINITE, + XNTIMER_RELATIVE); if (xnthread_test_flags (&xeno_current_task()->thread_base, XNBREAK)) @@ -439,7 +440,7 @@ int rt_task_suspend(RT_TASK *task) if (task->suspend_depth++ == 0) xnpod_suspend_thread(&task->thread_base, XNSUSP, XN_INFINITE, - NULL); + XNTIMER_RELATIVE, NULL); unlock_and_exit: xnlock_put_irqrestore(&nklock, s); @@ -932,7 +933,7 @@ int rt_task_sleep(RTIME delay) implicitely calls the rescheduling procedure. */ xnpod_suspend_thread(&xeno_current_task()->thread_base, - XNDELAY, delay, NULL); + XNDELAY, delay, XNTIMER_RELATIVE, NULL); return xnthread_test_flags(&xeno_current_task()->thread_base, XNBREAK) ? -EINTR : 0; @@ -981,7 +982,6 @@ int rt_task_sleep(RTIME delay) int rt_task_sleep_until(RTIME date) { int err = 0; - SRTIME delay; spl_t s; if (xnpod_unblockable_p()) @@ -995,11 +995,9 @@ int rt_task_sleep_until(RTIME date) /* Calling the suspension service on behalf of the current task implicitely calls the rescheduling procedure. */ - delay = date - xnpod_get_time(); - - if (delay > 0) { + if (date > xnpod_get_time()) { xnpod_suspend_thread(&xeno_current_task()->thread_base, - XNDELAY, delay, NULL); + XNDELAY, date, XNTIMER_ABSOLUTE, NULL); if (xnthread_test_flags (&xeno_current_task()->thread_base, XNBREAK)) @@ -1764,7 +1762,7 @@ ssize_t rt_task_send(RT_TASK *task, required by the priority inheritance protocol (i.e. prio(sender) > prio(receiver)). */ - xnsynch_sleep_on(&task->msendq, timeout); + xnsynch_sleep_on(&task->msendq, timeout, XNTIMER_RELATIVE); if (xnthread_test_flags(&sender->thread_base, XNRMID)) err = -EIDRM; /* Receiver deleted while pending. */ @@ -1924,7 +1922,7 @@ int rt_task_receive(RT_TASK_MCB *mcb_r, /* Wait on our receive slot for some sender to enqueue itself in our send queue. */ - xnsynch_sleep_on(&receiver->mrecv, timeout); + xnsynch_sleep_on(&receiver->mrecv, timeout, XNTIMER_RELATIVE); /* XNRMID cannot happen, since well, the current task would be the deleted object, so... */ Index: xenomai/ksrc/skins/posix/clock.c =================================================================== --- xenomai.orig/ksrc/skins/posix/clock.c +++ xenomai/ksrc/skins/posix/clock.c @@ -246,7 +246,8 @@ int clock_nanosleep(clockid_t clock_id, thread_cancellation_point(cur); - xnpod_suspend_thread(cur, XNDELAY, timeout + 1, NULL); + xnpod_suspend_thread(cur, XNDELAY, timeout + 1, + XNTIMER_RELATIVE, NULL); thread_cancellation_point(cur); Index: xenomai/ksrc/skins/posix/cond.c =================================================================== --- xenomai.orig/ksrc/skins/posix/cond.c +++ xenomai/ksrc/skins/posix/cond.c @@ -289,7 +289,7 @@ int pse51_cond_timedwait_internal(struct } /* Wait for another thread to signal the condition. */ - xnsynch_sleep_on(&cond->synchbase, to); + xnsynch_sleep_on(&cond->synchbase, to, XNTIMER_RELATIVE); /* There are four possible wakeup conditions : - cond_signal / cond_broadcast, no status bit is set, and the function Index: xenomai/ksrc/skins/posix/mq.c =================================================================== --- xenomai.orig/ksrc/skins/posix/mq.c +++ xenomai/ksrc/skins/posix/mq.c @@ -581,7 +581,7 @@ static int pse51_mq_timedsend_inner(mqd_ thread_cancellation_point(cur); - xnsynch_sleep_on(&mq->senders, to); + xnsynch_sleep_on(&mq->senders, to, XNTIMER_RELATIVE); thread_cancellation_point(cur); @@ -643,7 +643,7 @@ static int pse51_mq_timedrcv_inner(mqd_t thread_cancellation_point(cur); - xnsynch_sleep_on(&mq->receivers, to); + xnsynch_sleep_on(&mq->receivers, to, XNTIMER_RELATIVE); thread_cancellation_point(cur); Index: xenomai/ksrc/skins/posix/mutex.c =================================================================== --- xenomai.orig/ksrc/skins/posix/mutex.c +++ xenomai/ksrc/skins/posix/mutex.c @@ -214,7 +214,7 @@ int pse51_mutex_timedlock_break(struct _ if (err) break; - xnsynch_sleep_on(&mutex->synchbase, to); + xnsynch_sleep_on(&mutex->synchbase, to, XNTIMER_RELATIVE); if (xnthread_test_flags(cur, XNBREAK)) { err = EINTR; Index: xenomai/ksrc/skins/posix/mutex.h =================================================================== --- xenomai.orig/ksrc/skins/posix/mutex.h +++ xenomai/ksrc/skins/posix/mutex.h @@ -87,7 +87,7 @@ static inline int mutex_timedlock_intern if (err) return err; - xnsynch_sleep_on(&mutex->synchbase, to); + xnsynch_sleep_on(&mutex->synchbase, to, XNTIMER_RELATIVE); if (xnthread_test_flags(cur, XNBREAK)) return EINTR; Index: xenomai/ksrc/skins/posix/registry.c =================================================================== --- xenomai.orig/ksrc/skins/posix/registry.c +++ xenomai/ksrc/skins/posix/registry.c @@ -179,7 +179,8 @@ int pse51_node_get(pse51_node_t ** nodep return EPERM; } - xnsynch_sleep_on(node->completion_synch, XN_INFINITE); + xnsynch_sleep_on(node->completion_synch, XN_INFINITE, + XNTIMER_RELATIVE); cur = xnpod_current_thread(); Index: xenomai/ksrc/skins/posix/sem.c =================================================================== --- xenomai.orig/ksrc/skins/posix/sem.c +++ xenomai/ksrc/skins/posix/sem.c @@ -537,7 +537,7 @@ static inline int sem_timedwait_internal thread_cancellation_point(cur); - xnsynch_sleep_on(&sem->synchbase, to); + xnsynch_sleep_on(&sem->synchbase, to, XNTIMER_RELATIVE); /* Handle cancellation requests. */ thread_cancellation_point(cur); Index: xenomai/ksrc/skins/posix/signal.c =================================================================== --- xenomai.orig/ksrc/skins/posix/signal.c +++ xenomai/ksrc/skins/posix/signal.c @@ -835,7 +835,8 @@ static int pse51_sigtimedwait_inner(cons thread_cancellation_point(&thread->threadbase); - xnpod_suspend_thread(&thread->threadbase, XNDELAY, to, NULL); + xnpod_suspend_thread(&thread->threadbase, XNDELAY, to, + XNTIMER_RELATIVE, NULL); thread_cancellation_point(&thread->threadbase); Index: xenomai/ksrc/skins/posix/syscall.c =================================================================== --- xenomai.orig/ksrc/skins/posix/syscall.c +++ xenomai/ksrc/skins/posix/syscall.c @@ -2137,7 +2137,7 @@ static int __intr_wait(struct task_struc /* Renice the waiter above all regular threads if needed. */ xnpod_renice_thread(thread, XNCORE_IRQ_PRIO); - xnsynch_sleep_on(&intr->synch_base, timeout); + xnsynch_sleep_on(&intr->synch_base, timeout, XNTIMER_RELATIVE); if (xnthread_test_flags(thread, XNRMID)) err = -EIDRM; /* Interrupt object deleted while pending. */ Index: xenomai/ksrc/skins/posix/thread.c =================================================================== --- xenomai.orig/ksrc/skins/posix/thread.c +++ xenomai/ksrc/skins/posix/thread.c @@ -414,7 +414,8 @@ int pthread_join(pthread_t thread, void thread_cancellation_point(cur); - xnsynch_sleep_on(&thread->join_synch, XN_INFINITE); + xnsynch_sleep_on(&thread->join_synch, XN_INFINITE, + XNTIMER_RELATIVE); is_last_joiner = xnsynch_wakeup_one_sleeper(&thread->join_synch) == NULL; Index: xenomai/ksrc/skins/psos+/event.c =================================================================== --- xenomai.orig/ksrc/skins/psos+/event.c +++ xenomai/ksrc/skins/psos+/event.c @@ -71,7 +71,7 @@ u_long ev_receive(u_long events, u_long psos_current_task()->waitargs.evgroup.flags = flags; psos_current_task()->waitargs.evgroup.events = events; - xnsynch_sleep_on(&evgroup->synchbase, timeout); + xnsynch_sleep_on(&evgroup->synchbase, timeout, XNTIMER_RELATIVE); if (xnthread_test_flags(&psos_current_task()->threadbase, XNTIMEO)) { *events_r = psos_current_task()->waitargs.evgroup.events; Index: xenomai/ksrc/skins/psos+/queue.c =================================================================== --- xenomai.orig/ksrc/skins/psos+/queue.c +++ xenomai/ksrc/skins/psos+/queue.c @@ -365,7 +365,7 @@ static u_long q_receive_internal(u_long xnarch_post_graph_if(&queue->synchbase, 1, /* PENDED */ xnsynch_nsleepers(&queue->synchbase) == 0); - xnsynch_sleep_on(&queue->synchbase, timeout); + xnsynch_sleep_on(&queue->synchbase, timeout, XNTIMER_RELATIVE); if (xnthread_test_flags (&psos_current_task()->threadbase, XNRMID)) { Index: xenomai/ksrc/skins/psos+/rn.c =================================================================== --- xenomai.orig/ksrc/skins/psos+/rn.c +++ xenomai/ksrc/skins/psos+/rn.c @@ -210,7 +210,7 @@ u_long rn_getseg(u_long rnid, caller = psos_current_task(); caller->waitargs.region.size = size; caller->waitargs.region.chunk = NULL; - xnsynch_sleep_on(&rn->synchbase, timeout); + xnsynch_sleep_on(&rn->synchbase, timeout, XNTIMER_RELATIVE); if (xnthread_test_flags(&caller->threadbase, XNRMID)) err = ERR_RNKILLD; /* Region deleted while pending. */ Index: xenomai/ksrc/skins/psos+/sem.c =================================================================== --- xenomai.orig/ksrc/skins/psos+/sem.c +++ xenomai/ksrc/skins/psos+/sem.c @@ -178,7 +178,7 @@ u_long sm_p(u_long smid, u_long flags, u if (sem->count > 0) sem->count--; else { - xnsynch_sleep_on(&sem->synchbase, timeout); + xnsynch_sleep_on(&sem->synchbase, timeout, XNTIMER_RELATIVE); if (xnthread_test_flags (&psos_current_task()->threadbase, XNRMID)) Index: xenomai/ksrc/skins/psos+/task.c =================================================================== --- xenomai.orig/ksrc/skins/psos+/task.c +++ xenomai/ksrc/skins/psos+/task.c @@ -410,7 +410,8 @@ u_long t_suspend(u_long tid) goto unlock_and_exit; } - xnpod_suspend_thread(&task->threadbase, XNSUSP, XN_INFINITE, NULL); + xnpod_suspend_thread(&task->threadbase, XNSUSP, XN_INFINITE, + XNTIMER_RELATIVE, NULL); unlock_and_exit: Index: xenomai/ksrc/skins/rtdm/drvlib.c =================================================================== --- xenomai.orig/ksrc/skins/rtdm/drvlib.c +++ xenomai/ksrc/skins/rtdm/drvlib.c @@ -329,7 +329,8 @@ int rtdm_task_sleep(uint64_t delay) XENO_ASSERT(RTDM, !xnpod_unblockable_p(), return -EPERM;); - xnpod_suspend_thread(thread, XNDELAY, xnpod_ns2ticks(delay), NULL); + xnpod_suspend_thread(thread, XNDELAY, xnpod_ns2ticks(delay), + XNTIMER_RELATIVE, NULL); return xnthread_test_flags(thread, XNBREAK) ? -EINTR : 0; } @@ -362,27 +363,14 @@ EXPORT_SYMBOL(rtdm_task_sleep); int rtdm_task_sleep_until(uint64_t wakeup_time) { xnthread_t *thread = xnpod_current_thread(); - xnsticks_t delay; - spl_t s; - int err = 0; XENO_ASSERT(RTDM, !xnpod_unblockable_p(), return -EPERM;); - xnlock_get_irqsave(&nklock, s); - - delay = xnpod_ns2ticks(wakeup_time) - xnpod_get_time(); - - if (likely(delay > 0)) { - xnpod_suspend_thread(thread, XNDELAY, delay, NULL); - - if (xnthread_test_flags(thread, XNBREAK)) - err = -EINTR; - } - - xnlock_put_irqrestore(&nklock, s); + xnpod_suspend_thread(thread, XNDELAY, xnpod_ns2ticks(wakeup_time), + XNTIMER_ABSOLUTE, NULL); - return err; + return xnthread_test_flags(thread, XNBREAK) ? -EINTR : 0; } EXPORT_SYMBOL(rtdm_task_sleep_until); @@ -704,15 +692,12 @@ int rtdm_event_timedwait(rtdm_event_t *e if (timeout_seq && (timeout > 0)) { /* timeout sequence */ - timeout = *timeout_seq - xnpod_get_time(); - if (unlikely(timeout <= 0)) { - err = -ETIMEDOUT; - goto unlock_out; - } - xnsynch_sleep_on(&event->synch_base, timeout); + xnsynch_sleep_on(&event->synch_base, *timeout_seq, + XNTIMER_ABSOLUTE); } else { /* infinite or relative timeout */ - xnsynch_sleep_on(&event->synch_base, xnpod_ns2ticks(timeout)); + xnsynch_sleep_on(&event->synch_base, xnpod_ns2ticks(timeout), + XNTIMER_RELATIVE); } thread = xnpod_current_thread(); @@ -905,15 +890,12 @@ int rtdm_sem_timeddown(rtdm_sem_t *sem, else { if (timeout_seq && (timeout > 0)) { /* timeout sequence */ - timeout = *timeout_seq - xnpod_get_time(); - if (unlikely(timeout <= 0)) { - err = -ETIMEDOUT; - goto unlock_out; - } - xnsynch_sleep_on(&sem->synch_base, timeout); + xnsynch_sleep_on(&sem->synch_base, *timeout_seq, + XNTIMER_ABSOLUTE); } else { /* infinite or relative timeout */ - xnsynch_sleep_on(&sem->synch_base, xnpod_ns2ticks(timeout)); + xnsynch_sleep_on(&sem->synch_base, xnpod_ns2ticks(timeout), + XNTIMER_RELATIVE); } thread = xnpod_current_thread(); @@ -928,7 +910,6 @@ int rtdm_sem_timeddown(rtdm_sem_t *sem, } } - unlock_out: xnlock_put_irqrestore(&nklock, s); return err; @@ -1133,15 +1114,12 @@ int rtdm_mutex_timedlock(rtdm_mutex_t *m restart: if (timeout_seq && (timeout > 0)) { /* timeout sequence */ - timeout = *timeout_seq - xnpod_get_time(); - if (unlikely(timeout <= 0)) { - err = -ETIMEDOUT; - goto unlock_out; - } - xnsynch_sleep_on(&mutex->synch_base, timeout); + xnsynch_sleep_on(&mutex->synch_base, *timeout_seq, + XNTIMER_ABSOLUTE); } else { /* infinite or relative timeout */ - xnsynch_sleep_on(&mutex->synch_base, xnpod_ns2ticks(timeout)); + xnsynch_sleep_on(&mutex->synch_base, xnpod_ns2ticks(timeout), + XNTIMER_RELATIVE); } if (unlikely(xnthread_test_flags(thread, XNTIMEO|XNRMID|XNBREAK))) { Index: xenomai/ksrc/skins/uitron/flag.c =================================================================== --- xenomai.orig/ksrc/skins/uitron/flag.c +++ xenomai/ksrc/skins/uitron/flag.c @@ -254,7 +254,7 @@ static ER wai_flg_helper(UINT *p_flgptn, else { task = ui_current_task(); - xnsynch_sleep_on(&flg->synchbase, timeout); + xnsynch_sleep_on(&flg->synchbase, timeout, XNTIMER_RELATIVE); if (xnthread_test_flags(&task->threadbase, XNRMID)) err = E_DLT; /* Flag deleted while pending. */ Index: xenomai/ksrc/skins/uitron/mbx.c =================================================================== --- xenomai.orig/ksrc/skins/uitron/mbx.c +++ xenomai/ksrc/skins/uitron/mbx.c @@ -223,7 +223,7 @@ static ER rcv_msg_helper(T_MSG ** ppk_ms else { task = ui_current_task(); - xnsynch_sleep_on(&mbx->synchbase, timeout); + xnsynch_sleep_on(&mbx->synchbase, timeout, XNTIMER_RELATIVE); if (xnthread_test_flags(&task->threadbase, XNRMID)) err = E_DLT; /* Flag deleted while pending. */ Index: xenomai/ksrc/skins/uitron/sem.c =================================================================== --- xenomai.orig/ksrc/skins/uitron/sem.c +++ xenomai/ksrc/skins/uitron/sem.c @@ -205,7 +205,7 @@ static ER wai_sem_helper(ID semid, TMO t else { task = ui_current_task(); - xnsynch_sleep_on(&sem->synchbase, timeout); + xnsynch_sleep_on(&sem->synchbase, timeout, XNTIMER_RELATIVE); if (xnthread_test_flags(&task->threadbase, XNRMID)) err = E_DLT; /* Semaphore deleted while pending. */ Index: xenomai/ksrc/skins/uitron/task.c =================================================================== --- xenomai.orig/ksrc/skins/uitron/task.c +++ xenomai/ksrc/skins/uitron/task.c @@ -226,7 +226,7 @@ void ext_tsk(void) } xnpod_suspend_thread(&ui_current_task()->threadbase, - XNDORMANT, XN_INFINITE, NULL); + XNDORMANT, XN_INFINITE, XNTIMER_RELATIVE, NULL); } void exd_tsk(void) @@ -269,7 +269,8 @@ static void ter_tsk_helper(uitask_t * ta xnpod_unblock_thread(&task->threadbase); - xnpod_suspend_thread(&task->threadbase, XNDORMANT, XN_INFINITE, NULL); + xnpod_suspend_thread(&task->threadbase, XNDORMANT, XN_INFINITE, + XNTIMER_RELATIVE, NULL); xnlock_put_irqrestore(&nklock, s); } @@ -556,8 +557,8 @@ ER sus_tsk(ID tskid) } if (task->suspcnt++ == 0) - xnpod_suspend_thread(&task->threadbase, - XNSUSP, XN_INFINITE, NULL); + xnpod_suspend_thread(&task->threadbase, XNSUSP, + XN_INFINITE, XNTIMER_RELATIVE, NULL); xnlock_put_irqrestore(&nklock, s); return E_OK; @@ -633,7 +634,8 @@ ER slp_tsk(void) xnthread_set_flags(&task->threadbase, uITRON_TASK_SLEEP); - xnpod_suspend_thread(&task->threadbase, XNDELAY, XN_INFINITE, NULL); + xnpod_suspend_thread(&task->threadbase, XNDELAY, XN_INFINITE, + XNTIMER_RELATIVE, NULL); xnthread_clear_flags(&task->threadbase, uITRON_TASK_SLEEP); @@ -674,7 +676,8 @@ ER tslp_tsk(TMO tmout) xnthread_set_flags(&task->threadbase, uITRON_TASK_SLEEP); - xnpod_suspend_thread(&task->threadbase, XNDELAY, tmout, NULL); + xnpod_suspend_thread(&task->threadbase, XNDELAY, tmout, + XNTIMER_RELATIVE, NULL); xnthread_clear_flags(&task->threadbase, uITRON_TASK_SLEEP); Index: xenomai/ksrc/skins/vrtx/event.c =================================================================== --- xenomai.orig/ksrc/skins/vrtx/event.c +++ xenomai/ksrc/skins/vrtx/event.c @@ -252,7 +252,7 @@ int sc_fpend(int evid, long timeout, int /* xnsynch_sleep_on() called for the current thread automatically reschedules. */ - xnsynch_sleep_on(&evgroup->synchbase, timeout); + xnsynch_sleep_on(&evgroup->synchbase, timeout, XNTIMER_RELATIVE); if (xnthread_test_flags(&task->threadbase, XNBREAK)) *errp = -EINTR; Index: xenomai/ksrc/skins/vrtx/mb.c =================================================================== --- xenomai.orig/ksrc/skins/vrtx/mb.c +++ xenomai/ksrc/skins/vrtx/mb.c @@ -283,7 +283,7 @@ char *sc_pend(char **mboxp, long timeout if (timeout) task->vrtxtcb.TCBSTAT |= TBSDELAY; - xnsynch_sleep_on(&mb->synchbase, timeout); + xnsynch_sleep_on(&mb->synchbase, timeout, XNTIMER_RELATIVE); if (xnthread_test_flags(&task->threadbase, XNBREAK)) { *errp = -EINTR; Index: xenomai/ksrc/skins/vrtx/mx.c =================================================================== --- xenomai.orig/ksrc/skins/vrtx/mx.c +++ xenomai/ksrc/skins/vrtx/mx.c @@ -267,7 +267,7 @@ void sc_mpend(int mid, unsigned long tim if (timeout) task->vrtxtcb.TCBSTAT |= TBSDELAY; - xnsynch_sleep_on(&mx->synchbase, timeout); + xnsynch_sleep_on(&mx->synchbase, timeout, XNTIMER_RELATIVE); if (xnthread_test_flags(&task->threadbase, XNBREAK)) *errp = -EINTR; Index: xenomai/ksrc/skins/vrtx/queue.c =================================================================== --- xenomai.orig/ksrc/skins/vrtx/queue.c +++ xenomai/ksrc/skins/vrtx/queue.c @@ -317,7 +317,7 @@ char *sc_qpend(int qid, long timeout, in if (timeout) task->vrtxtcb.TCBSTAT |= TBSDELAY; - xnsynch_sleep_on(&queue->synchbase, timeout); + xnsynch_sleep_on(&queue->synchbase, timeout, XNTIMER_RELATIVE); if (xnthread_test_flags(&task->threadbase, XNBREAK)) { *errp = -EINTR; Index: xenomai/ksrc/skins/vrtx/sem.c =================================================================== --- xenomai.orig/ksrc/skins/vrtx/sem.c +++ xenomai/ksrc/skins/vrtx/sem.c @@ -242,7 +242,7 @@ void sc_spend(int semid, long timeout, i if (timeout) task->vrtxtcb.TCBSTAT |= TBSDELAY; - xnsynch_sleep_on(&sem->synchbase, timeout); + xnsynch_sleep_on(&sem->synchbase, timeout, XNTIMER_RELATIVE); if (xnthread_test_flags(&task->threadbase, XNBREAK)) *errp = -EINTR; Index: xenomai/ksrc/skins/vrtx/task.c =================================================================== --- xenomai.orig/ksrc/skins/vrtx/task.c +++ xenomai/ksrc/skins/vrtx/task.c @@ -419,7 +419,8 @@ void sc_tsuspend(int tid, int opt, int * task->vrtxtcb.TCBSTAT = TBSSUSP; xnpod_suspend_thread(&task->threadbase, - XNSUSP, XN_INFINITE, NULL); + XNSUSP, XN_INFINITE, + XNTIMER_RELATIVE, NULL); } } @@ -450,7 +451,8 @@ void sc_tsuspend(int tid, int opt, int * *errp = RET_OK; - xnpod_suspend_thread(&task->threadbase, XNSUSP, XN_INFINITE, NULL); + xnpod_suspend_thread(&task->threadbase, XNSUSP, XN_INFINITE, + XNTIMER_RELATIVE, NULL); unlock_and_exit: xnlock_put_irqrestore(&nklock, s); Index: xenomai/ksrc/skins/vxworks/msgQLib.c =================================================================== --- xenomai.orig/ksrc/skins/vxworks/msgQLib.c +++ xenomai/ksrc/skins/vxworks/msgQLib.c @@ -289,7 +289,8 @@ int msgQReceive(MSG_Q_ID qid, char *buf, task->rcv_buf = buf; task->rcv_bytes = bytes; - xnsynch_sleep_on(&queue->synchbase, timeout); + xnsynch_sleep_on(&queue->synchbase, timeout, + XNTIMER_RELATIVE); error_check(xnthread_test_flags(thread, XNBREAK), -EINTR, goto error); @@ -364,7 +365,8 @@ STATUS msgQSend(MSG_Q_ID qid, const char else timeout = to; - xnsynch_sleep_on(&queue->synchbase, timeout); + xnsynch_sleep_on(&queue->synchbase, timeout, + XNTIMER_RELATIVE); error_check(xnthread_test_flags(thread, XNBREAK), -EINTR, goto error); Index: xenomai/ksrc/skins/vxworks/semLib.c =================================================================== --- xenomai.orig/ksrc/skins/vxworks/semLib.c +++ xenomai/ksrc/skins/vxworks/semLib.c @@ -270,7 +270,7 @@ static STATUS semb_take(wind_sem_t *sem, error_check(to == XN_NONBLOCK, S_objLib_OBJ_UNAVAILABLE, return ERROR); - xnsynch_sleep_on(&sem->synchbase, to); + xnsynch_sleep_on(&sem->synchbase, to, XNTIMER_RELATIVE); error_check(xnthread_test_flags(thread, XNBREAK), -EINTR, return ERROR); @@ -345,7 +345,7 @@ static STATUS semm_take(wind_sem_t *sem, error_check(to == XN_NONBLOCK, S_objLib_OBJ_UNAVAILABLE, return ERROR); - xnsynch_sleep_on(&sem->synchbase, to); + xnsynch_sleep_on(&sem->synchbase, to, XNTIMER_RELATIVE); error_check(xnthread_test_flags(thread, XNBREAK), -EINTR, return ERROR); Index: xenomai/ksrc/skins/vxworks/syscall.c =================================================================== --- xenomai.orig/ksrc/skins/vxworks/syscall.c +++ xenomai/ksrc/skins/vxworks/syscall.c @@ -1166,7 +1166,7 @@ static int __wind_wd_wait(struct task_st /* Renice the waiter above all regular tasks if needed. */ xnpod_renice_thread(&pTcb->threadbase, XNCORE_IRQ_PRIO); - xnsynch_sleep_on(&wd->synchbase, XN_INFINITE); + xnsynch_sleep_on(&wd->synchbase, XN_INFINITE, XNTIMER_RELATIVE); if (xnthread_test_flags(&pTcb->threadbase, XNRMID)) err = -EIDRM; /* Watchdog deleted while pending. */ Index: xenomai/ksrc/skins/vxworks/taskLib.c =================================================================== --- xenomai.orig/ksrc/skins/vxworks/taskLib.c +++ xenomai/ksrc/skins/vxworks/taskLib.c @@ -319,7 +319,8 @@ STATUS taskSuspend(TASK_ID task_id) check_OBJ_ID_ERROR(task_id, wind_task_t, task, WIND_TASK_MAGIC, goto error); - xnpod_suspend_thread(&task->threadbase, XNSUSP, XN_INFINITE, NULL); + xnpod_suspend_thread(&task->threadbase, XNSUSP, XN_INFINITE, + XNTIMER_RELATIVE, NULL); xnlock_put_irqrestore(&nklock, s); @@ -564,7 +565,8 @@ TASK_ID taskNameToId(const char *name) static int testSafe(wind_task_t *task) { while (task->safecnt > 0) { - xnsynch_sleep_on(&task->safesync, XN_INFINITE); + xnsynch_sleep_on(&task->safesync, XN_INFINITE, + XNTIMER_RELATIVE); error_check(xnthread_test_flags(&task->threadbase, XNBREAK), -EINTR, return ERROR); }
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Xenomai-core mailing list Xenomai-core@gna.org https://mail.gna.org/listinfo/xenomai-core