#include #include #include "eventloop.h" #include "util.h" struct eventLoop *eventLoopNew() { int epollfd = epoll_create1(0); if (epollfd == -1) return NULL; struct eventLoop *eventLoop = malloc(sizeof(*eventLoop)); eventLoop->epollfd = epollfd; eventLoop->size = EVENT_LOOP_MAX_EVENTS; return eventLoop; } int eventLoopWait(struct eventLoop *el, int timeout) { return epoll_wait(el->epollfd, el->events, el->size, timeout); } struct tsocket *eventLoopGetSocket(struct eventLoop *el, int index) { return (struct tsocket *)el->events[index].data.ptr; } int eventLoopAdd(struct eventLoop *el, struct event *ev, int flag) { struct epoll_event epev; epev.events = flag; epev.data.ptr = ev; ev->el = el; return epoll_ctl(el->epollfd, EPOLL_CTL_ADD, ev->fd, &epev); } struct event *eventLoopGet(struct eventLoop *el, int index) { return (struct event *)el->events[index].data.ptr; } void eventLoopLoop(struct eventLoop *el) { int nevents; struct event *ev; for (;;) { nevents = eventLoopWait(el, -1); if (nevents == -1) panic("eventloop wait"); for (int i = 0; i < nevents; i++) { ev = eventLoopGet(el, i); ev->handle(ev); } } } int eventLoopDel(struct eventLoop *el, struct event *ev) { if (epoll_ctl(el->epollfd, EPOLL_CTL_DEL, ev->fd, NULL) == -1) return ERROR; if (ev->delete) ev->delete(ev); else free(ev); return OK; }