Merge branch 'master' of https://github.com/davmac314/dinit
authorDavin McCall <davmac@davmac.org>
Sun, 19 Jun 2016 19:13:09 +0000 (20:13 +0100)
committerDavin McCall <davmac@davmac.org>
Sun, 19 Jun 2016 19:13:09 +0000 (20:13 +0100)
src/dasynq/dasynq-kqueue.h

index f6d4ce27a9d308670a3b95725a67a00a6c3e9346..dd3765a69406a64a353fb25a480431f8537ab152 100644 (file)
@@ -199,7 +199,7 @@ template <class Base> class KqueueLoop : public Base
     // flags:  IN_EVENTS | OUT_EVENTS
     void addFdWatch(int fd, void *userdata, int flags)
     {
-        // TODO kqueue doesn't support EVFILE_WRITE on file fd's :/
+        // TODO kqueue doesn't support EVFILT_WRITE on file fd's :/
         // Presumably they cause the kevent call to fail. We could maintain
         // a separate set and use poll() (urgh).
         
@@ -215,8 +215,10 @@ template <class Base> class KqueueLoop : public Base
     void addBidiFdWatch(int fd, void *userdata, int flags)
     {
         struct kevent kev[2];
-        EV_SET(&kev[0], fd, EVFILT_READ, EV_ADD, 0, 0, userdata);
-        EV_SET(&kev[1], fd, EVFILE_WRITE, EV_ADD, 0, 0, userdata);
+        short rflags = EV_ADD | ((flags & IN_EVENTS) ? 0 : EV_DISABLE);
+        short wflags = EV_ADD | ((flags & OUT_EVENTS) ? 0 : EV_DISABLE);
+        EV_SET(&kev[0], fd, EVFILT_READ, rflags, 0, 0, userdata);
+        EV_SET(&kev[1], fd, EVFILT_WRITE, wflags, 0, 0, userdata);
         
         if (kevent(kqfd, kev, 2, nullptr, 0, nullptr) == -1) {
             throw new std::system_error(errno, std::system_category());
@@ -236,8 +238,8 @@ template <class Base> class KqueueLoop : public Base
     void removeBidiFdWatch(int fd) noexcept
     {
         struct kevent kev[2];
-        EV_SET(&kev[0], fd, EVFILT_READ, EV_DELETE, 0, 0, userdata);
-        EV_SET(&kev[1], fd, EVFILE_WRITE, EV_DELETE, 0, 0, userdata);
+        EV_SET(&kev[0], fd, EVFILT_READ, EV_DELETE, 0, 0, nullptr);
+        EV_SET(&kev[1], fd, EVFILT_WRITE, EV_DELETE, 0, 0, nullptr);
         
         kevent(kqfd, kev, 2, nullptr, 0, nullptr);
     }