summaryrefslogtreecommitdiff
path: root/src/fdevent.c
diff options
context:
space:
mode:
authorGlenn Strauss <gstrauss@gluelogic.com>2019-02-23 01:35:58 -0500
committerGlenn Strauss <gstrauss@gluelogic.com>2019-03-07 00:32:17 -0500
commit0a46f7ec23a924f4e53874ce32471209b2b70686 (patch)
tree3d84131d972b9df55ec37bc45d4aac16e8000714 /src/fdevent.c
parent8441c9e8e8ee02aa72e75d11a0094540b015f596 (diff)
downloadlighttpd-git-0a46f7ec23a924f4e53874ce32471209b2b70686.tar.gz
[core] some fdevent code streamlining
isolate fde_ndx to fdevent framework internals
Diffstat (limited to 'src/fdevent.c')
-rw-r--r--src/fdevent.c216
1 files changed, 90 insertions, 126 deletions
diff --git a/src/fdevent.c b/src/fdevent.c
index d20e6fd3..be7db2b7 100644
--- a/src/fdevent.c
+++ b/src/fdevent.c
@@ -196,66 +196,51 @@ fdevents *fdevent_init(server *srv) {
ev->maxfds = maxfds;
switch(type) {
+ #ifdef FDEVENT_USE_POLL
case FDEVENT_HANDLER_POLL:
- if (0 != fdevent_poll_init(ev)) {
- log_error_write(srv, __FILE__, __LINE__, "S",
- "event-handler poll failed");
- goto error;
- }
- return ev;
+ if (0 == fdevent_poll_init(ev)) return ev;
+ break;
+ #endif
+ #ifdef FDEVENT_USE_SELECT
case FDEVENT_HANDLER_SELECT:
- if (0 != fdevent_select_init(ev)) {
- log_error_write(srv, __FILE__, __LINE__, "S",
- "event-handler select failed");
- goto error;
- }
- return ev;
+ if (0 == fdevent_select_init(ev)) return ev;
+ break;
+ #endif
+ #ifdef FDEVENT_USE_LINUX_EPOLL
case FDEVENT_HANDLER_LINUX_SYSEPOLL:
- if (0 != fdevent_linux_sysepoll_init(ev)) {
- log_error_write(srv, __FILE__, __LINE__, "S",
- "event-handler linux-sysepoll failed, try to set server.event-handler = \"poll\" or \"select\"");
- goto error;
- }
- return ev;
+ if (0 == fdevent_linux_sysepoll_init(ev)) return ev;
+ break;
+ #endif
+ #ifdef FDEVENT_USE_SOLARIS_DEVPOLL
case FDEVENT_HANDLER_SOLARIS_DEVPOLL:
- if (0 != fdevent_solaris_devpoll_init(ev)) {
- log_error_write(srv, __FILE__, __LINE__, "S",
- "event-handler solaris-devpoll failed, try to set server.event-handler = \"poll\" or \"select\"");
- goto error;
- }
- return ev;
+ if (0 == fdevent_solaris_devpoll_init(ev)) return ev;
+ break;
+ #endif
+ #ifdef FDEVENT_USE_SOLARIS_PORT
case FDEVENT_HANDLER_SOLARIS_PORT:
- if (0 != fdevent_solaris_port_init(ev)) {
- log_error_write(srv, __FILE__, __LINE__, "S",
- "event-handler solaris-eventports failed, try to set server.event-handler = \"poll\" or \"select\"");
- goto error;
- }
- return ev;
+ if (0 == fdevent_solaris_port_init(ev)) return ev;
+ break;
+ #endif
+ #ifdef FDEVENT_USE_FREEBSD_KQUEUE
case FDEVENT_HANDLER_FREEBSD_KQUEUE:
- if (0 != fdevent_freebsd_kqueue_init(ev)) {
- log_error_write(srv, __FILE__, __LINE__, "S",
- "event-handler freebsd-kqueue failed, try to set server.event-handler = \"poll\" or \"select\"");
- goto error;
- }
- return ev;
+ if (0 == fdevent_freebsd_kqueue_init(ev)) return ev;
+ break;
+ #endif
+ #ifdef FDEVENT_USE_LIBEV
case FDEVENT_HANDLER_LIBEV:
- if (0 != fdevent_libev_init(ev)) {
- log_error_write(srv, __FILE__, __LINE__, "S",
- "event-handler libev failed, try to set server.event-handler = \"poll\" or \"select\"");
- goto error;
- }
- return ev;
+ if (0 == fdevent_libev_init(ev)) return ev;
+ break;
+ #endif
case FDEVENT_HANDLER_UNSET:
default:
break;
}
-error:
free(ev->fdarray);
free(ev);
- log_error_write(srv, __FILE__, __LINE__, "S",
- "event-handler is unknown, try to set server.event-handler = \"poll\" or \"select\"");
+ log_error_write(srv, __FILE__, __LINE__, "sBS",
+ "event-handler failed:", srv->srvconf.event_handler, "; try to set server.event-handler = \"poll\" or \"select\"");
return NULL;
}
@@ -277,59 +262,44 @@ void fdevent_free(fdevents *ev) {
}
int fdevent_reset(fdevents *ev) {
- if (ev->reset) return ev->reset(ev);
-
- return 0;
+ int rc = (NULL != ev->reset) ? ev->reset(ev) : 0;
+ if (-1 == rc) {
+ log_error_write(ev->srv, __FILE__, __LINE__, "sBS",
+ "event-handler failed:", ev->srv->srvconf.event_handler, "; try to set server.event-handler = \"poll\" or \"select\"");
+ }
+ return rc;
}
static fdnode *fdnode_init(void) {
- fdnode *fdn;
-
- fdn = calloc(1, sizeof(*fdn));
- force_assert(NULL != fdn);
- fdn->fd = -1;
- return fdn;
+ return calloc(1, sizeof(fdnode));
}
static void fdnode_free(fdnode *fdn) {
free(fdn);
}
-int fdevent_register(fdevents *ev, int fd, fdevent_handler handler, void *ctx) {
- fdnode *fdn;
-
- fdn = fdnode_init();
+void fdevent_register(fdevents *ev, int fd, fdevent_handler handler, void *ctx) {
+ fdnode *fdn = ev->fdarray[fd] = fdnode_init();
+ force_assert(NULL != fdn);
fdn->handler = handler;
fdn->fd = fd;
fdn->ctx = ctx;
fdn->events = 0;
+ fdn->fde_ndx = -1;
#ifdef FDEVENT_USE_LIBEV
fdn->handler_ctx = NULL;
#endif
-
- ev->fdarray[fd] = fdn;
-
- return 0;
}
-int fdevent_unregister(fdevents *ev, int fd) {
- fdnode *fdn;
-
- if (!ev) return 0;
- fdn = ev->fdarray[fd];
- if ((uintptr_t)fdn & 0x3) return 0; /*(should not happen)*/
-
- fdnode_free(fdn);
-
+void fdevent_unregister(fdevents *ev, int fd) {
+ fdnode *fdn = ev->fdarray[fd];
+ if ((uintptr_t)fdn & 0x3) return; /*(should not happen)*/
ev->fdarray[fd] = NULL;
-
- return 0;
+ fdnode_free(fdn);
}
void fdevent_sched_close(fdevents *ev, int fd, int issock) {
- fdnode *fdn;
- if (!ev) return;
- fdn = ev->fdarray[fd];
+ fdnode *fdn = ev->fdarray[fd];
if ((uintptr_t)fdn & 0x3) return;
ev->fdarray[fd] = (fdnode *)((uintptr_t)fdn | (issock ? 0x1 : 0x2));
fdn->ctx = ev->pendclose;
@@ -376,72 +346,66 @@ int fdevent_event_get_interest(const fdevents *ev, int fd) {
return fd >= 0 ? ev->fdarray[fd]->events : 0;
}
-void fdevent_event_del(fdevents *ev, int *fde_ndx, int fd) {
- if (-1 == fd) return;
- if ((uintptr_t)ev->fdarray[fd] & 0x3) return;
-
- if (ev->event_del) *fde_ndx = ev->event_del(ev, *fde_ndx, fd);
- ev->fdarray[fd]->events = 0;
+static void fdevent_fdnode_event_del(fdevents *ev, fdnode *fdn) {
+ if (-1 == fdn->fde_ndx) return;
+ if (0 == ev->event_del(ev, fdn)) {
+ fdn->fde_ndx = -1;
+ fdn->events = 0;
+ }
+ else {
+ log_error_write(ev->srv, __FILE__, __LINE__, "SS",
+ "fdevent event_del failed: ", strerror(errno));
+ }
}
-void fdevent_event_set(fdevents *ev, int *fde_ndx, int fd, int events) {
- if (-1 == fd) return;
-
- /*(Note: skips registering with kernel if initial events is 0,
- * so caller should pass non-zero events for initial registration.
- * If never registered due to never being called with non-zero events,
- * then FDEVENT_HUP or FDEVENT_ERR will never be returned.) */
- if (ev->fdarray[fd]->events == events) return;/*(no change; nothing to do)*/
+static void fdevent_fdnode_event_set(fdevents *ev, fdnode *fdn, int events) {
+ /*(Note: skips registering with kernel if initial events is 0,
+ * so caller should pass non-zero events for initial registration.
+ * If never registered due to never being called with non-zero events,
+ * then FDEVENT_HUP or FDEVENT_ERR will never be returned.) */
+ if (fdn->events == events) return;/*(no change; nothing to do)*/
- if (ev->event_set) *fde_ndx = ev->event_set(ev, *fde_ndx, fd, events);
- ev->fdarray[fd]->events = events;
+ if (0 == ev->event_set(ev, fdn, events))
+ fdn->events = events;
+ else
+ log_error_write(ev->srv, __FILE__, __LINE__, "SS",
+ "fdevent event_set failed: ", strerror(errno));
}
-void fdevent_event_add(fdevents *ev, int *fde_ndx, int fd, int event) {
- int events;
- if (-1 == fd) return;
+void fdevent_event_del(fdevents *ev, int *fde_ndx, int fd) {
+ UNUSED(fde_ndx);
+ if (-1 != fd) {
+ fdnode *fdn = ev->fdarray[fd];
+ if ((uintptr_t)fdn & 0x3) return;
+ fdevent_fdnode_event_del(ev, fdn);
+ }
+}
- events = ev->fdarray[fd]->events;
- if ((events & event) == event) return; /*(no change; nothing to do)*/
+void fdevent_event_set(fdevents *ev, int *fde_ndx, int fd, int events) {
+ UNUSED(fde_ndx);
+ if (-1 != fd) fdevent_fdnode_event_set(ev, ev->fdarray[fd], events);
+}
- events |= event;
- if (ev->event_set) *fde_ndx = ev->event_set(ev, *fde_ndx, fd, events);
- ev->fdarray[fd]->events = events;
+void fdevent_event_add(fdevents *ev, int *fde_ndx, int fd, int event) {
+ UNUSED(fde_ndx);
+ if (-1 != fd) {
+ fdnode *fdn = ev->fdarray[fd];
+ fdevent_fdnode_event_set(ev, fdn, (fdn->events | event));
+ }
}
void fdevent_event_clr(fdevents *ev, int *fde_ndx, int fd, int event) {
- int events;
- if (-1 == fd) return;
-
- events = ev->fdarray[fd]->events;
- if (!(events & event)) return; /*(no change; nothing to do)*/
-
- events &= ~event;
- if (ev->event_set) *fde_ndx = ev->event_set(ev, *fde_ndx, fd, events);
- ev->fdarray[fd]->events = events;
+ UNUSED(fde_ndx);
+ if (-1 != fd) {
+ fdnode *fdn = ev->fdarray[fd];
+ fdevent_fdnode_event_set(ev, fdn, (fdn->events & ~event));
+ }
}
int fdevent_poll(fdevents *ev, int timeout_ms) {
- if (ev->poll == NULL) SEGFAULT();
return ev->poll(ev, timeout_ms);
}
-fdevent_handler fdevent_get_handler(fdevents *ev, int fd) {
- if (ev->fdarray[fd] == NULL) SEGFAULT();
- if ((uintptr_t)ev->fdarray[fd] & 0x3) return NULL;
- if (ev->fdarray[fd]->fd != fd) SEGFAULT();
-
- return ev->fdarray[fd]->handler;
-}
-
-void * fdevent_get_context(fdevents *ev, int fd) {
- if (ev->fdarray[fd] == NULL) SEGFAULT();
- if ((uintptr_t)ev->fdarray[fd] & 0x3) return NULL;
- if (ev->fdarray[fd]->fd != fd) SEGFAULT();
-
- return ev->fdarray[fd]->ctx;
-}
-
void fdevent_setfd_cloexec(int fd) {
#ifdef FD_CLOEXEC
if (fd < 0) return;