Update Dasynq
authorDavin McCall <davmac@davmac.org>
Tue, 21 Jun 2016 13:25:19 +0000 (14:25 +0100)
committerDavin McCall <davmac@davmac.org>
Tue, 21 Jun 2016 13:25:19 +0000 (14:25 +0100)
src/dasynq/dasynq-epoll.h
src/dasynq/dasynq-kqueue.h
src/dasynq/dasynq.h

index 7a93e21fcb99f2c2074f28dd91bc4b4bc01ed883..dd1f404b982a50659b04ebf31178c245f0b4c91a 100644 (file)
@@ -146,7 +146,7 @@ template <class Base> class EpollLoop : public Base
     }
     
     // flags:  IN_EVENTS | OUT_EVENTS
-    void addFdWatch(int fd, void *userdata, int flags)
+    void addFdWatch(int fd, void *userdata, int flags, bool enabled = true)
     {
         struct epoll_event epevent;
         // epevent.data.fd = fd;
@@ -156,10 +156,10 @@ template <class Base> class EpollLoop : public Base
         if (flags & ONE_SHOT) {
             epevent.events = EPOLLONESHOT;
         }
-        if (flags & IN_EVENTS) {
+        if ((flags & IN_EVENTS) && enabled) {
             epevent.events |= EPOLLIN;
         }
-        if (flags & OUT_EVENTS) {
+        if ((flags & OUT_EVENTS) && enabled) {
             epevent.events |= EPOLLOUT;
         }
 
index dd3765a69406a64a353fb25a480431f8537ab152..784068caca1933bc5b155109cfc498085a7b25ea 100644 (file)
@@ -197,7 +197,7 @@ template <class Base> class KqueueLoop : public Base
     }
     
     // flags:  IN_EVENTS | OUT_EVENTS
-    void addFdWatch(int fd, void *userdata, int flags)
+    void addFdWatch(int fd, void *userdata, int flags, bool enabled = true)
     {
         // TODO kqueue doesn't support EVFILT_WRITE on file fd's :/
         // Presumably they cause the kevent call to fail. We could maintain
@@ -206,7 +206,7 @@ template <class Base> class KqueueLoop : public Base
         short filter = (flags & IN_EVENTS) ? EVFILT_READ : EVFILT_WRITE;
         
         struct kevent kev;
-        EV_SET(&kev, fd, filter, EV_ADD, 0, 0, userdata);
+        EV_SET(&kev, fd, filter, EV_ADD | (enabled ? 0 : EV_DISABLE), 0, 0, userdata);
         if (kevent(kqfd, &kev, 1, nullptr, 0, nullptr) == -1) {
             throw new std::system_error(errno, std::system_category());
         }
index 426fd8b6ce0b3cab9ff4eb868667fe1f2d2d48af..b5a34b13733bfc1b507cad67c2bbdb8e530428e3 100644 (file)
@@ -585,9 +585,9 @@ template <typename T_Mutex> class EventLoop
         releaseLock(qnode);
     }
 
-    void registerFd(BaseFdWatcher *callback, int fd, int eventmask)
+    void registerFd(BaseFdWatcher *callback, int fd, int eventmask, bool enabled)
     {
-        loop_mech.addFdWatch(fd, callback, eventmask | ONE_SHOT);
+        loop_mech.addFdWatch(fd, callback, eventmask | ONE_SHOT, enabled);
     }
     
     void registerFd(BaseBidiFdWatcher *callback, int fd, int eventmask)
@@ -1072,12 +1072,12 @@ class FdWatcher : private dprivate::BaseFdWatcher<typename EventLoop::mutex_t>
     // causes undefined behavior.
     //
     // Can fail with std::bad_alloc or std::system_error.
-    void addWatch(EventLoop &eloop, int fd, int flags)
+    void addWatch(EventLoop &eloop, int fd, int flags, bool enabled = true)
     {
         BaseWatcher::init();
         this->watch_fd = fd;
         this->watch_flags = flags;
-        eloop.registerFd(this, fd, flags);
+        eloop.registerFd(this, fd, flags, enabled);
     }
     
     // Deregister a file descriptor watcher.