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:
committed by
Justin Maggard
parent
aefe4dd0bf
commit
7ba9e52fc8
28
select.c
28
select.c
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user