From: Bert Hubert Date: Sun, 16 Apr 2006 19:36:23 +0000 (+0000) Subject: make kqueue mplexer actually work X-Git-Tag: rec-3-0~41 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0023fc15ced65cd4d623458147363ae25c50f17d;p=pdns make kqueue mplexer actually work git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@712 d19b8d6e-7fed-0310-83ef-9ca221ded41b --- diff --git a/pdns/kqueuemplexer.cc b/pdns/kqueuemplexer.cc index e08f7500d..1866df185 100644 --- a/pdns/kqueuemplexer.cc +++ b/pdns/kqueuemplexer.cc @@ -5,13 +5,13 @@ #include "misc.hh" #include #include "syncres.hh" -#include +#include +#include +#include using namespace boost; using namespace std; -#include - 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 d_kevents; + boost::shared_array 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(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(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 "<