commit - 7a554149cbcb335372a2fde5f03142644de381c5
commit + c48cf63883dde2f28bca9aa8b97e0bcd94b071ff
blob - 8ead398358280dd3bbcbccb9d677bf8fdad17a96
blob + 473ce3d8dd057cae13b31e8676d33d366f2082f3
--- ev.c
+++ ev.c
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)
{
}
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;
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
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;
}
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)
{
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;
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
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 *);