commit c48cf63883dde2f28bca9aa8b97e0bcd94b071ff from: Omar Polo date: Sun Feb 18 22:43:05 2024 UTC ev: define EV_* constants instead of reusing POLL{IN,OUT} Dissociate us a bit from poll(2) so that we may even run on top of something else, and also allows to provide specific values for signal (EV_SIGNAL) and timers (EV_TIMEOUT). commit - 7a554149cbcb335372a2fde5f03142644de381c5 commit + c48cf63883dde2f28bca9aa8b97e0bcd94b071ff blob - 8ead398358280dd3bbcbccb9d677bf8fdad17a96 blob + 473ce3d8dd057cae13b31e8676d33d366f2082f3 --- ev.c +++ ev.c @@ -121,6 +121,19 @@ ev_init(void) return 0; } +static inline int +ev2poll(int ev) +{ + int ret = 0; + + if (ev & EV_READ) + ret |= POLLIN; + if (ev & EV_WRITE) + ret |= POLLOUT; + + return (ret); +} + int ev_add(int fd, int ev, void (*cb)(int, int, void *), void *udata) { @@ -130,7 +143,8 @@ ev_add(int fd, int ev, void (*cb)(int, int, void *), v } base->pfds[fd].fd = fd; - base->pfds[fd].events = ev; + base->pfds[fd].events = ev2poll(ev); + base->pfds[fd].revents = 0; base->cbs[fd].cb = cb; base->cbs[fd].udata = udata; @@ -164,7 +178,7 @@ ev_sigdispatch(int fd, int ev, void *data) if (read(fd, &signo, sizeof(signo)) != sizeof(signo)) return; - base->sigcb.cb(signo, 0, base->sigcb.udata); + base->sigcb.cb(signo, EV_SIGNAL, base->sigcb.udata); } int @@ -181,7 +195,7 @@ ev_signal(int sig, void (*cb)(int, int, void *), void fcntl(base->sigpipe[1], F_SETFL, flags | O_NONBLOCK) == -1) return -1; - if (ev_add(base->sigpipe[0], POLLIN, ev_sigdispatch, NULL) + if (ev_add(base->sigpipe[0], EV_READ, ev_sigdispatch, NULL) == -1) return -1; } @@ -350,6 +364,19 @@ ev_del(int fd) return 0; } +static inline int +poll2ev(int ev) +{ + int r = 0; + + if (ev & (POLLIN|POLLHUP)) + r |= EV_READ; + if (ev & (POLLOUT|POLLWRNORM|POLLWRBAND)) + r |= EV_WRITE; + + return (r); +} + int ev_loop(void) { @@ -383,7 +410,7 @@ ev_loop(void) for (i = 0; i < base->ntimers && !ev_stop; /* nop */) { timersub(&base->timers[i].tv, &tv, &sub); if (sub.tv_sec <= 0) { - base->timers[i].cb.cb(-1, POLLHUP, + base->timers[i].cb.cb(-1, EV_TIMEOUT, base->timers[i].cb.udata); cancel_timer(i); continue; @@ -399,7 +426,7 @@ ev_loop(void) if (base->pfds[i].revents & (POLLIN|POLLOUT|POLLHUP)) { n--; base->cbs[i].cb(base->pfds[i].fd, - base->pfds[i].revents, + poll2ev(base->pfds[i].revents), base->cbs[i].udata); } } blob - 9697eeb7c227c45cc70b4228a7d91eecc015aa91 blob + 5acab20e7fbb2e60a71a039e05a4562199f825ec --- ev.h +++ ev.h @@ -25,6 +25,11 @@ struct timeval; +#define EV_READ 0x1 +#define EV_WRITE 0x2 +#define EV_SIGNAL 0x4 +#define EV_TIMEOUT 0x8 + int ev_init(void); int ev_add(int, int, void(*)(int, int, void *), void *); int ev_signal(int, void(*)(int, int, void * ), void *);