Esempio n. 1
0
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;
}
Esempio n. 2
0
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);
}