]> granicus.if.org Git - pdns/commitdiff
make kqueue mplexer actually work
authorBert Hubert <bert.hubert@netherlabs.nl>
Sun, 16 Apr 2006 19:36:23 +0000 (19:36 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Sun, 16 Apr 2006 19:36:23 +0000 (19:36 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@712 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/kqueuemplexer.cc

index e08f7500ddcfcbb502c62d4c25ab4f148a92c5d1..1866df18500cc6a828216971a1f3ebad78ae66ff 100644 (file)
@@ -5,13 +5,13 @@
 #include "misc.hh"
 #include <boost/lexical_cast.hpp>
 #include "syncres.hh"
-#include <sys/epoll.h>
+#include <sys/types.h>
+#include <sys/event.h>
+#include <sys/time.h>
 
 using namespace boost;
 using namespace std;
 
-#include <sys/epoll.h>
-
 class KqueueFDMultiplexer : public FDMultiplexer
 {
 public:
@@ -27,7 +27,7 @@ public:
   virtual void removeFD(callbackmap_t& cbmap, int fd);
 private:
   int d_kqueuefd;
-  boost::shared_array<epoll_event> d_kevents;
+  boost::shared_array<struct kevent> d_kevents;
   static int s_maxevents; // not a hard maximum
 };
 
@@ -36,9 +36,8 @@ FDMultiplexer* getMultiplexer()
   return new KqueueFDMultiplexer();
 }
 
-
 int KqueueFDMultiplexer::s_maxevents=1024;
-KqueueFDMultiplexer::KqueueFDMultiplexer() : d_kevents(new epoll_event[s_maxevents])
+KqueueFDMultiplexer::KqueueFDMultiplexer() : d_kevents(new struct kevent[s_maxevents])
 {
   d_kqueuefd=kqueue();
   if(d_kqueuefd < 0)
@@ -53,12 +52,11 @@ void KqueueFDMultiplexer::addFD(callbackmap_t& cbmap, int fd, callbackfunc_t toD
 
   if(cbmap.count(fd))
     throw FDMultiplexerException("Tried to add fd "+lexical_cast<string>(fd)+ " to multiplexer twice");
+
   struct kevent kqevent;
-  
   EV_SET(&kqevent, fd, (&cbmap == &d_readCallbacks) ? EVFILT_READ : EVFILT_WRITE, EV_ADD, 0,0,0);
   
-  int tmp;
-  if(kevent(d_kqueuefd, &kqevent, &tmp, 0, 0, 0) < 0)
+  if(kevent(d_kqueuefd, &kqevent, 1, 0, 0, 0) < 0)
     throw FDMultiplexerException("Adding fd to kqueue set: "+stringerror());
 
   cbmap[fd]=cb;
@@ -72,10 +70,10 @@ void KqueueFDMultiplexer::removeFD(callbackmap_t& cbmap, int fd)
   if(!cbmap.erase(fd))
     throw FDMultiplexerException("Tried to remove unlisted fd "+lexical_cast<string>(fd)+ " from multiplexer");
 
+  struct kevent kqevent;
   EV_SET(&kqevent, fd, (&cbmap == &d_readCallbacks) ? EVFILT_READ : EVFILT_WRITE, EV_DELETE, 0,0,0);
   
-  int tmp=1;
-  if(kevent(d_kqueuefd, &kqevent, &tmp, 0, 0, 0) < 0)
+  if(kevent(d_kqueuefd, &kqevent, 1, 0, 0, 0) < 0)
     throw FDMultiplexerException("Removing fd from kqueue set: "+stringerror());
 }
 
@@ -86,7 +84,7 @@ int KqueueFDMultiplexer::run(struct timeval* now)
   }
   
   struct timespec ts;
-  ts.ts_sec=0;
+  ts.tv_sec=0;
   ts.tv_nsec=500000000U;
 
   int ret=kevent(d_kqueuefd, 0, 0, d_kevents.get(), s_maxevents, &ts);
@@ -94,7 +92,7 @@ int KqueueFDMultiplexer::run(struct timeval* now)
     gettimeofday(now,0);
   
   if(ret < 0 && errno!=EINTR)
-    throw FDMultiplexerException("select returned error: "+stringerror());
+    throw FDMultiplexerException("kqueue returned error: "+stringerror());
 
   if(ret==0) // nothing
     return 0;
@@ -107,7 +105,7 @@ int KqueueFDMultiplexer::run(struct timeval* now)
     if(d_iter != d_readCallbacks.end())
       d_iter->second.d_callback(d_iter->first, d_iter->second.d_parameter);
 
-    d_iter=d_writeCallbacks.find(d_kevents[n].data.fd);
+    d_iter=d_writeCallbacks.find(d_kevents[n].ident);
     
     if(d_iter != d_writeCallbacks.end())
       d_iter->second.d_callback(d_iter->first, d_iter->second.d_parameter);
@@ -127,6 +125,7 @@ void acceptData(int fd, boost::any& parameter)
   cout<<"Received "<<packet.size()<<" bytes!\n";
 }
 
+#if 0
 int main()
 {
   Socket s(InterNetwork, Datagram);
@@ -144,6 +143,7 @@ int main()
   sfm.removeReadFD(s.getHandle());
   sfm.removeReadFD(s.getHandle());
 }
+#endif