void li_event_io_set_events(liEventIO *io, int events) { if (events == io->events) return; io->events = events; if (li_event_attached(io) && li_event_active(io)) { liEventLoop *loop = io->base.link_watchers.data; LI_FORCE_ASSERT(NULL != loop); ev_ref(loop->loop); ev_io_stop(loop->loop, &io->libevmess.io); ev_io_set(&io->libevmess.io, io->libevmess.io.fd, io_events_to_libev(events)); ev_io_start(loop->loop, &io->libevmess.io); ev_unref(loop->loop); } else { ev_io_set(&io->libevmess.io, io->libevmess.io.fd, io_events_to_libev(events)); } }
void li_event_io_init(liEventLoop *loop, liEventIO *io, liEventCallback callback, int fd, int events) { memset(io, 0, sizeof(*io)); io->base.type = LI_EVT_IO; io->base.keep_loop_alive = 1; io->base.callback = callback; io->events = events; ev_init(&io->libevmess.w, NULL); ev_io_set(&io->libevmess.io, fd, io_events_to_libev(events)); ev_set_cb(&io->libevmess.io, event_io_cb); if (NULL != loop) li_event_attach(loop, io); }