src/server/daemon/event_bsd.c

changeset 109
8a0a7754f123
parent 79
f48cea237ec3
child 111
c93be34fde76
--- 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 <stdio.h>
 #include <stdlib.h>
 
+#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;i<nev;i++) {
+            event_t *event = events[i].udata;
+            if(event->fn) {
+                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;
 }

mercurial