static void __tt_wq_add_event (TT_WQ_T *wait_queue) { TT_THREAD_T *thread = tt_thread_self (); listMove (&wait_queue->list, &thread->list_schedule); thread->wait_parent = wait_queue; }
/* 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; }