void Fiber::suspend_and_continue(STATE) { UnmanagedPhase unmanaged(state); { std::unique_lock<std::mutex> lk(vm()->fiber_wait_mutex()); vm()->set_suspended(); while(!wakeup_p()) { vm()->fiber_wait_condition().wait(lk); } clear_wakeup(); vm()->set_resuming(); } { std::lock_guard<std::mutex> guard(state->vm()->thread()->fiber_mutex()); vm()->set_running(); while(!restart_context()->suspended_p()) { ; // spin wait } state->vm()->thread()->current_fiber(state, this); } }
int avahi_simple_poll_prepare(AvahiSimplePoll *s, int timeout) { AvahiTimeout *next_timeout; assert(s); assert(s->state == STATE_INIT || s->state == STATE_DISPATCHED || s->state == STATE_FAILURE); s->state = STATE_PREPARING; /* Clear pending wakeup requests */ clear_wakeup(s); /* Cleanup things first */ if (s->watch_req_cleanup) cleanup_watches(s, 0); if (s->timeout_req_cleanup) cleanup_timeouts(s, 0); /* Check whether a quit was requested */ if (s->quit) { s->state = STATE_QUIT; return 1; } /* Do we need to rebuild our array of pollfds? */ if (s->rebuild_pollfds) if (rebuild(s) < 0) { s->state = STATE_FAILURE; return -1; } /* Calculate the wakeup time */ if ((next_timeout = find_next_timeout(s))) { struct timeval now; int t; AvahiUsec usec; if (next_timeout->expiry.tv_sec == 0 && next_timeout->expiry.tv_usec == 0) { /* Just a shortcut so that we don't need to call gettimeofday() */ timeout = 0; goto finish; } gettimeofday(&now, NULL); usec = avahi_timeval_diff(&next_timeout->expiry, &now); if (usec <= 0) { /* Timeout elapsed */ timeout = 0; goto finish; } /* Calculate sleep time. We add 1ms because otherwise we'd * wake up too early most of the time */ t = (int) (usec / 1000) + 1; if (timeout < 0 || timeout > t) timeout = t; } finish: s->prepared_timeout = timeout; s->state = STATE_PREPARED; return 0; }