static void create_cursorhold_event(void) { // If events are enabled and the queue has any items, this function should not // have been called(inbuf_poll would return kInputAvail) // TODO(tarruda): Cursorhold should be implemented as a timer set during the // `state_check` callback for the states where it can be triggered. assert(!events_enabled || multiqueue_empty(main_loop.events)); multiqueue_put(main_loop.events, cursorhold_event, 0); }
static void async_cb(uv_async_t *handle) { Loop *l = handle->loop->data; uv_mutex_lock(&l->mutex); while (!multiqueue_empty(l->thread_events)) { Event ev = multiqueue_get(l->thread_events); multiqueue_put_event(l->fast_events, ev); } uv_mutex_unlock(&l->mutex); }
static bool input_poll(int ms) { if (do_profiling == PROF_YES && ms) { prof_inchar_enter(); } if ((ms == - 1 || ms > 0) && !events_enabled && !input_eof) { // The pending input provoked a blocking wait. Do special events now. #6247 blocking = true; multiqueue_process_events(ch_before_blocking_events); } DLOG("blocking... events_enabled=%d events_pending=%d", events_enabled, !multiqueue_empty(main_loop.events)); LOOP_PROCESS_EVENTS_UNTIL(&main_loop, NULL, ms, input_ready() || input_eof); blocking = false; if (do_profiling == PROF_YES && ms) { prof_inchar_exit(); } return input_ready(); }