static int wait(struct waithead *wh, uint64_t nsec) { struct waiter w; w.who = bmk_sched_current(); TAILQ_INSERT_TAIL(wh, &w, entries); w.onlist = 1; bmk_sched_block(w.who); if (nsec) bmk_sched_setwakeup(w.who, bmk_clock_now() + nsec); bmk_sched(); /* woken up by timeout? */ if (w.onlist) TAILQ_REMOVE(wh, &w, entries); return w.onlist ? ETIMEDOUT : 0; }
static int wait(struct waithead *wh, bmk_time_t wakeup) { struct waiter w; if (wakeup != BMK_SCHED_BLOCK_INFTIME) wakeup += bmk_platform_cpu_clock_monotonic(); w.who = bmk_current; w.onlist = 1; TAILQ_INSERT_TAIL(wh, &w, entries); bmk_sched_blockprepare_timeout(wakeup); bmk_sched_block(); /* woken up by timeout? */ if (w.onlist) TAILQ_REMOVE(wh, &w, entries); return w.onlist ? BMK_ETIMEDOUT : 0; }