|
|
|
@ -62,30 +62,12 @@ static int fdevent_poll_event_del(fdevents *ev, int fde_ndx, int fd) {
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
|
static int fdevent_poll_event_compress(fdevents *ev) {
|
|
|
|
|
size_t j;
|
|
|
|
|
|
|
|
|
|
if (ev->used == 0) return 0;
|
|
|
|
|
if (ev->unused.used != 0) return 0;
|
|
|
|
|
|
|
|
|
|
for (j = ev->used - 1; j + 1 > 0 && ev->pollfds[j].fd == -1; j--) ev->used--;
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static int fdevent_poll_event_set(fdevents *ev, int fde_ndx, int fd, int events) {
|
|
|
|
|
int pevents = 0;
|
|
|
|
|
if (events & FDEVENT_IN) pevents |= POLLIN;
|
|
|
|
|
if (events & FDEVENT_OUT) pevents |= POLLOUT;
|
|
|
|
|
if (events & FDEVENT_RDHUP) pevents |= POLLRDHUP;
|
|
|
|
|
|
|
|
|
|
/* known index */
|
|
|
|
|
int k;
|
|
|
|
|
|
|
|
|
|
if (fde_ndx != -1) {
|
|
|
|
|
if (ev->pollfds[fde_ndx].fd == fd) {
|
|
|
|
|
ev->pollfds[fde_ndx].events = pevents;
|
|
|
|
|
ev->pollfds[fde_ndx].events = events;
|
|
|
|
|
|
|
|
|
|
return fde_ndx;
|
|
|
|
|
}
|
|
|
|
@ -95,12 +77,8 @@ static int fdevent_poll_event_set(fdevents *ev, int fde_ndx, int fd, int events)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (ev->unused.used > 0) {
|
|
|
|
|
int k = ev->unused.ptr[--ev->unused.used];
|
|
|
|
|
|
|
|
|
|
ev->pollfds[k].fd = fd;
|
|
|
|
|
ev->pollfds[k].events = pevents;
|
|
|
|
|
k = ev->unused.ptr[--ev->unused.used];
|
|
|
|
|
|
|
|
|
|
return k;
|
|
|
|
|
} else {
|
|
|
|
|
if (ev->size == ev->used) {
|
|
|
|
|
ev->size += 16;
|
|
|
|
@ -108,47 +86,16 @@ static int fdevent_poll_event_set(fdevents *ev, int fde_ndx, int fd, int events)
|
|
|
|
|
force_assert(NULL != ev->pollfds);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ev->pollfds[ev->used].fd = fd;
|
|
|
|
|
ev->pollfds[ev->used].events = pevents;
|
|
|
|
|
|
|
|
|
|
return ev->used++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int fdevent_poll_event_get_revent(const fdevents *ev, size_t ndx) {
|
|
|
|
|
int r, poll_r;
|
|
|
|
|
|
|
|
|
|
if (ndx >= ev->used) {
|
|
|
|
|
log_error_write(ev->srv, __FILE__, __LINE__, "sii",
|
|
|
|
|
"dying because: event: ", (int) ndx, (int) ev->used);
|
|
|
|
|
|
|
|
|
|
SEGFAULT();
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
k = ev->used++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (ev->pollfds[ndx].revents & POLLNVAL) {
|
|
|
|
|
/* should never happen */
|
|
|
|
|
SEGFAULT();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
r = 0;
|
|
|
|
|
poll_r = ev->pollfds[ndx].revents;
|
|
|
|
|
|
|
|
|
|
/* map POLL* to FDEVEN_*; they are probably the same, but still. */
|
|
|
|
|
|
|
|
|
|
if (poll_r & POLLIN) r |= FDEVENT_IN;
|
|
|
|
|
if (poll_r & POLLOUT) r |= FDEVENT_OUT;
|
|
|
|
|
if (poll_r & POLLERR) r |= FDEVENT_ERR;
|
|
|
|
|
if (poll_r & POLLHUP) r |= FDEVENT_HUP;
|
|
|
|
|
if (poll_r & POLLNVAL) r |= FDEVENT_NVAL;
|
|
|
|
|
if (poll_r & POLLPRI) r |= FDEVENT_PRI;
|
|
|
|
|
if (poll_r & POLLRDHUP) r |= FDEVENT_RDHUP;
|
|
|
|
|
ev->pollfds[k].fd = fd;
|
|
|
|
|
ev->pollfds[k].events = events;
|
|
|
|
|
|
|
|
|
|
return r;
|
|
|
|
|
return k;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int fdevent_poll_event_next_fdndx(const fdevents *ev, int ndx) {
|
|
|
|
|
static int fdevent_poll_next_ndx(const fdevents *ev, int ndx) {
|
|
|
|
|
for (size_t i = (size_t)(ndx+1); i < ev->used; ++i) {
|
|
|
|
|
if (ev->pollfds[i].revents) return i;
|
|
|
|
|
}
|
|
|
|
@ -156,18 +103,12 @@ static int fdevent_poll_event_next_fdndx(const fdevents *ev, int ndx) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int fdevent_poll_poll(fdevents *ev, int timeout_ms) {
|
|
|
|
|
#if 0
|
|
|
|
|
fdevent_poll_event_compress(ev);
|
|
|
|
|
#endif
|
|
|
|
|
int n = poll(ev->pollfds, ev->used, timeout_ms);
|
|
|
|
|
const int n = poll(ev->pollfds, ev->used, timeout_ms);
|
|
|
|
|
server * const srv = ev->srv;
|
|
|
|
|
for (int ndx = -1, i = 0; i < n; ++i) {
|
|
|
|
|
fdnode *fdn;
|
|
|
|
|
ndx = fdevent_poll_event_next_fdndx(ev, ndx);
|
|
|
|
|
if (-1 == ndx) break;
|
|
|
|
|
fdn = ev->fdarray[ev->pollfds[ndx].fd];
|
|
|
|
|
for (int ndx=-1,i=0; i<n && -1!=(ndx=fdevent_poll_next_ndx(ev,ndx)); ++i){
|
|
|
|
|
int revents = ev->pollfds[ndx].revents;
|
|
|
|
|
fdnode *fdn = ev->fdarray[ev->pollfds[ndx].fd];
|
|
|
|
|
if (0 == ((uintptr_t)fdn & 0x3)) {
|
|
|
|
|
int revents = fdevent_poll_event_get_revent(ev, ndx);
|
|
|
|
|
(*fdn->handler)(srv, fdn->ctx, revents);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -176,6 +117,15 @@ static int fdevent_poll_poll(fdevents *ev, int timeout_ms) {
|
|
|
|
|
|
|
|
|
|
int fdevent_poll_init(fdevents *ev) {
|
|
|
|
|
ev->type = FDEVENT_HANDLER_POLL;
|
|
|
|
|
force_assert(POLLIN == FDEVENT_IN);
|
|
|
|
|
force_assert(POLLPRI == FDEVENT_PRI);
|
|
|
|
|
force_assert(POLLOUT == FDEVENT_OUT);
|
|
|
|
|
force_assert(POLLERR == FDEVENT_ERR);
|
|
|
|
|
force_assert(POLLHUP == FDEVENT_HUP);
|
|
|
|
|
force_assert(POLLNVAL == FDEVENT_NVAL);
|
|
|
|
|
#if 0 != POLLRDHUP
|
|
|
|
|
force_assert(POLLRDHUP == FDEVENT_RDHUP);
|
|
|
|
|
#endif
|
|
|
|
|
#define SET(x) \
|
|
|
|
|
ev->x = fdevent_poll_##x;
|
|
|
|
|
|
|
|
|
|