/* Available in: thread. */ int tt_wq_wait_event_timeout (TT_WQ_T *wait_queue, uint32_t msec) { __TIMEOUT_WQ_T wq_args; wq_args.wait_queue = wait_queue; wq_args.thread = tt_thread_self (); if (tt_is_irq_disabled ()) { int i; __tt_wq_add_event (wait_queue); for (i = 0; tt_is_irq_disabled (); ++i) tt_enable_irq (); tt_timer_start (&wq_args.timer, __tt_wq_wakeup, &wq_args, msec); tt_syscall ((void *)&wq_args, __tt_wq_schedule_timeout); tt_timer_kill (&wq_args.timer); while (i-- != 0) tt_disable_irq (); } else { tt_timer_start (&wq_args.timer, __tt_wq_wakeup, &wq_args, msec); tt_syscall ((void *)&wq_args, __tt_wq_wait_event_timeout); tt_timer_kill (&wq_args.timer); } return wq_args.result; }
/* Available in: irq, thread. */ void tt_wq_set_event (TT_WQ_T *wait_queue) { if (tt_is_irq_disabled ()) __tt_wq_set_event (wait_queue); else tt_syscall ((void *)wait_queue, __tt_wq_set_event); }
/* Available in: thread (interruptable). */ void tt_wq_wait_event (TT_WQ_T *wait_queue) { if (tt_is_irq_disabled ()) { int i; __tt_wq_add_event (wait_queue); for (i = 0; tt_is_irq_disabled (); ++i) tt_enable_irq (); tt_syscall (NULL, __tt_schedule); while (i-- != 0) tt_disable_irq (); } else tt_syscall ((void *)wait_queue, __tt_wq_wait_event); }