[IOMultiplexer] Added asynchronous DNS Lookups
[IOMultiplexer.git] / src / IOEngine_kevent.c
index ee93f8645f09f63a25cb750df661d70b91c3d535..9a6f19056e3cf26e938b440d05265b247ff0af44 100644 (file)
@@ -31,48 +31,58 @@ static int engine_kevent_init() {
     return 1;
 }
 
-static void engine_kevent_add(struct IODescriptor *iofd) {
-    if(iofd->type == IOTYPE_TIMER) return;
+static void engine_kevent_add(struct IOLowlevelDescriptor *iold) {
+    if(iold->fd != -1) return;
     //add descriptor to the kevent queue
     struct kevent changes[2];
     int nchanges = 0;
     int res;
 
-    EV_SET(&changes[nchanges++], iofd->fd, EVFILT_READ, EV_ADD, 0, 0, iofd);
-    if (iohandler_wants_writes(iofd))
-        EV_SET(&changes[nchanges++], iofd->fd, EVFILT_WRITE, EV_ADD, 0, 0, iofd);
+    if (iold->flags & IOFLAGS_WANT_READ)
+        EV_SET(&changes[nchanges++], iold->fd, EVFILT_READ, EV_ADD, 0, 0, iold);
+    if (iold->flags & IOFLAGS_WANT_WRITE)
+        EV_SET(&changes[nchanges++], iold->fd, EVFILT_WRITE, EV_ADD, 0, 0, iold);
     
     res = kevent(kevent_fd, changes, nchanges, NULL, 0, NULL);
     if(res < 0)
-        iohandler_log(IOLOG_ERROR, "could not add IODescriptor %d to kevent queue. (returned: %d)", res);
+        iohandler_log(IOLOG_ERROR, "could not add IOLowlevelDescriptor %d to kevent queue. (returned: %d)", res);
 }
 
-static void engine_kevent_remove(struct IODescriptor *iofd) {
-    if(iofd->type == IOTYPE_TIMER) return;
+static void engine_kevent_remove(struct IOLowlevelDescriptor *iold) {
+    if(iold->fd != -1) return;
     struct kevent changes[2];
     int nchanges = 0;
 
-    EV_SET(&changes[nchanges++], iofd->fd, EVFILT_READ, EV_DELETE, 0, 0, iofd);
-    EV_SET(&changes[nchanges++], iofd->fd, EVFILT_WRITE, EV_DELETE, 0, 0, iofd);
+    EV_SET(&changes[nchanges++], iold->fd, EVFILT_READ, EV_DELETE, 0, 0, iold);
+    EV_SET(&changes[nchanges++], iold->fd, EVFILT_WRITE, EV_DELETE, 0, 0, iold);
     kevent(kevent_fd, changes, nchanges, NULL, 0, NULL);
 }
 
-static void engine_kevent_update(struct IODescriptor *iofd) {
-    if(iofd->type == IOTYPE_TIMER) return;
-    if(iofd->state == IO_CLOSED) {
-        engine_kevent_remove(iofd);
-        return;
+static void engine_kevent_update(struct IOLowlevelDescriptor *iold) {
+    if(iold->fd != -1) return;
+    struct IODescriptor *iofd;
+    if((iofd = IOLOWLEVEL_GET_IOFD(iold))) {
+        if(iofd->state == IO_CLOSED) {
+            engine_kevent_remove(iold);
+            return;
+        }
     }
     struct kevent changes[2];
     int nchanges = 0;
     int res;
 
-    EV_SET(&changes[nchanges++], iofd->fd, EVFILT_READ, EV_ADD, 0, 0, iofd);
-    EV_SET(&changes[nchanges++], iofd->fd, EVFILT_WRITE, iohandler_wants_writes(iofd) ? EV_ADD : EV_DELETE, 0, 0, iofd);
+    if (iold->flags & IOFLAGS_WANT_READ)
+        EV_SET(&changes[nchanges++], iold->fd, EVFILT_READ, EV_ADD, 0, 0, iold);
+    else
+        EV_SET(&changes[nchanges++], iold->fd, EVFILT_READ, EV_DELETE, 0, 0, iold);
+    if (iold->flags & IOFLAGS_WANT_WRITE)
+        EV_SET(&changes[nchanges++], iold->fd, EVFILT_WRITE, EV_ADD, 0, 0, iold);
+    else
+        EV_SET(&changes[nchanges++], iold->fd, EVFILT_WRITE, EV_DELETE, 0, 0, iold);
     
     res = kevent(kevent_fd, changes, nchanges, NULL, 0, NULL);
     if(res < 0) {
-        iohandler_log(IOLOG_ERROR, "could not update IODescriptor %d in kevent queue. (returned: %d)", res);
+        iohandler_log(IOLOG_ERROR, "could not update IOLowlevelDescriptor %d in kevent queue. (returned: %d)", res);
     }
 }
 
@@ -82,6 +92,7 @@ static void engine_kevent_loop(struct timeval *timeout) {
     struct timespec ts, *pts;
     int msec;
     int kevent_result;
+    struct IOLowlevelDescriptor *iold;
     
     gettimeofday(&now, NULL);
     
@@ -127,8 +138,13 @@ static void engine_kevent_loop(struct timeval *timeout) {
         }
     } else {
         int i;
-        for(i = 0; i < kevent_result; i++)
-            iohandler_events(events[i].udata, (events[i].filter == EVFILT_READ), (events[i].filter == EVFILT_WRITE));
+        for(i = 0; i < kevent_result; i++) {
+            iold = events[i].udata;
+            if(iold->flags & IOFLAGS_HAVE_IOFD)
+                iohandler_events(iold->data.iofd, (events[i].filter == EVFILT_READ), (events[i].filter == EVFILT_WRITE));
+            else
+                iold->data.callback(iold, (events[i].filter == EVFILT_READ), (events[i].filter == EVFILT_WRITE));
+        }
     }
     
     //check timers