int loop_start (evLoop *loop, int type){ while (loop->active_handles){ /* closing handles */ QUEUE *q; evHandle *handle; while ( !QUEUE_EMPTY(&loop->closing_queue) ){ q = QUEUE_HEAD(&(loop)->closing_queue); QUEUE_REMOVE(q); handle = QUEUE_DATA(q, evHandle, queue); assert(handle); if (handle->close != NULL){ handle->close(handle); } _free_handle(handle); } loop_update_time(loop); int timeout; if (type == 1){ timeout = 0; } else { timeout = next_timeout(loop); } loop_run_timers(loop); loop_run_immediate(loop); if (QUEUE_EMPTY(&loop->io_queue)) { #ifdef _WIN32 Sleep(timeout); #else usleep(1000 * timeout); #endif } else { io_poll(loop, timeout); } /* run once */ if (type == 1){ break; } } return loop->active_handles > 0; }
static void loop_run_timers(evLoop *loop) { struct heap_node *heap_node; evTimer *timer; for (;;) { loop_run_immediate(loop); heap_node = heap_min((struct heap*) &loop->timer_heap); if (heap_node == NULL) break; timer = container_of(heap_node, evTimer, heap_node); if (timer->timeout > loop->time) { break; } timer_again(timer->handle); timer->handle->cb(timer->handle); if (!timer->repeat || timer->repeat == 0) { timer_close(timer->handle); } } }
int loop_start (evLoop *loop, int type){ while (loop->active_handles){ /* closing handles */ loop_run_closing_handles(loop); loop_update_time(loop); int timeout; timeout = next_timeout(loop); if (type == 1 && timeout > 1){ timeout = 1; } loop_run_timers(loop); loop_run_immediate(loop); if (QUEUE_EMPTY(&loop->io_queue)) { #ifdef _WIN32 Sleep(timeout); #else usleep(1000 * timeout); #endif } else { io_poll(loop, timeout); } /* run once */ if (type == 1){ loop_update_time(loop); loop_run_timers(loop); break; } } /* check closing handles one last time*/ loop_run_closing_handles(loop); return loop->active_handles > 0; }