diff -r 2a394ccdd778 -r 8a0a7754f123 src/server/daemon/event_bsd.c --- a/src/server/daemon/event_bsd.c Sat Oct 31 18:02:07 2015 +0100 +++ b/src/server/daemon/event_bsd.c Sat Oct 31 20:10:21 2015 +0100 @@ -29,6 +29,8 @@ #include #include +#include "../util/atomic.h" + #include "event_bsd.h" event_handler_t* evhandler_create(int numthreads) { @@ -77,26 +79,65 @@ } void ev_handle_events(ev_thr_conf_t *conf) { + event_handler_t *ev = conf->handler; + int kq = conf->port; + free(conf); + + struct timespec timeout; + timeout.tv_nsec = 0; + timeout.tv_sec = 600; + + struct kevent events[16]; + + for(;;) { + // wait for events + int nev; + nev = kevent(kq, NULL, 0, events, 16, &timeout); + if(nev == -1) { + // TODO: check for error + perror("kevent"); + continue; + } + + for(int i=0;ifn) { + if(event->fn(ev, event)) { + // TODO: reassociate? + } else if(event->finish) { + event->finish(ev, event); + } + } + } + } } /* returns a event handler port */ int ev_get_port(event_handler_t *h) { + int nps = h->nports; + if(nps == 1) { + return h->ports[0]; + } + int cp = h->lp % nps; + ws_atomic_inc32(&h->lp); + + return h->ports[cp]; } int ev_pollin(event_handler_t *h, int fd, event_t *event) { - + struct kevent kev; + EV_SET(&kev, fd, EVFILT_READ, EV_ADD, 0, 0, event); + return kevent(ev_get_port(h), &kev, 1, NULL, 0, NULL); } int ev_pollout(event_handler_t *h, int fd, event_t *event) { - -} - -int ev_poll(event_handler_t *h, event_t *event) { - + struct kevent kev; + EV_SET(&kev, fd, EVFILT_WRITE, EV_ADD, 0, 0, event); + return kevent(ev_get_port(h), &kev, 1, NULL, 0, NULL); } int evt_send(event_handler_t *h, event_t *event) { - + return 0; }