static void timer_trigger(struct ev_loop* loop, ev_timer* watcher, int revents) { ev_timer_stop(loop, watcher); fiber_manager_t* const manager = fiber_manager_get(); fiber_t* const the_fiber = watcher->data; the_fiber->state = FIBER_STATE_READY; fiber_manager_schedule(manager, the_fiber); ++num_events_triggered; }
void fiber_manager_wake_from_queue(fiber_manager_t* manager, mpsc_fifo_t* fifo, int count) { mpsc_node_t* out = NULL; do { if((out = mpsc_fifo_pop(fifo))) { count -= 1; fiber_t* const to_schedule = (fiber_t*)out->data; assert(to_schedule->state == FIBER_STATE_WAITING); assert(!to_schedule->mpsc_node); to_schedule->mpsc_node = out; to_schedule->state = FIBER_STATE_READY; fiber_manager_schedule(manager, to_schedule); }/* TODO: sched yield after a few spins */ } while(count > 0); }