Add kqueue event module. Code inspired by nginx. There are a lot of room for optimization here, this is just first working version.

This commit is contained in:
Gleb Smirnoff
2017-12-28 10:39:17 -08:00
committed by Justin Maggard
parent aefe4dd0bf
commit 7ba9e52fc8
7 changed files with 254 additions and 32 deletions

View File

@ -17,7 +17,7 @@
static event_module_init_t select_init;
static event_module_fini_t select_fini;
static event_module_add_t select_add;
static event_module_add_t select_del;
static event_module_del_t select_del;
static event_module_process_t select_process;
static fd_set master_read_fd_set;
@ -32,8 +32,6 @@ static int max_fd;
struct event_module event_module = {
.add = select_add,
.del = select_del,
.enable = select_add,
.disable = select_del,
.process = select_process,
.init = select_init,
.fini = select_fini,
@ -68,7 +66,7 @@ static int
select_add(struct event *ev)
{
assert(ev->fd <= FD_SETSIZE);
assert(ev->fd < FD_SETSIZE);
switch (ev->rdwr) {
case EVENT_READ:
@ -77,10 +75,6 @@ select_add(struct event *ev)
case EVENT_WRITE:
FD_SET(ev->fd, &master_write_fd_set);
break;
case EVENT_RDWR:
FD_SET(ev->fd, &master_read_fd_set);
FD_SET(ev->fd, &master_write_fd_set);
break;
}
if (max_fd != -1 && max_fd < ev->fd)
@ -89,14 +83,16 @@ select_add(struct event *ev)
events[nevents] = ev;
ev->index = nevents++;
assert(nevents < FD_SETSIZE);
return (0);
}
static int
select_del(struct event *ev)
select_del(struct event *ev, int flags)
{
assert(ev->fd <= FD_SETSIZE);
assert(ev->fd < FD_SETSIZE);
switch (ev->rdwr) {
case EVENT_READ:
@ -105,10 +101,6 @@ select_del(struct event *ev)
case EVENT_WRITE:
FD_CLR(ev->fd, &master_write_fd_set);
break;
case EVENT_RDWR:
FD_CLR(ev->fd, &master_read_fd_set);
FD_CLR(ev->fd, &master_write_fd_set);
break;
}
if (max_fd == ev->fd)
@ -152,8 +144,7 @@ select_process(u_long msec)
if (ready == -1) {
if (errno == EINTR)
return (errno);
DPRINTF(E_ERROR, L_GENERAL, "select(all): %s\n", strerror(errno));
DPRINTF(E_FATAL, L_GENERAL, "Failed to select open sockets. EXITING\n");
DPRINTF(E_FATAL, L_GENERAL, "select(): %s. EXITING\n", strerror(errno));
}
if (ready == 0)
@ -171,11 +162,6 @@ select_process(u_long msec)
if (FD_ISSET(ev->fd, &work_write_fd_set))
ev->process(ev);
break;
case EVENT_RDWR:
if (FD_ISSET(ev->fd, &work_read_fd_set) ||
FD_ISSET(ev->fd, &work_write_fd_set))
ev->process(ev);
break;
}
}