#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:
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
};
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)
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;
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());
}
}
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);
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;
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);
cout<<"Received "<<packet.size()<<" bytes!\n";
}
+#if 0
int main()
{
Socket s(InterNetwork, Datagram);
sfm.removeReadFD(s.getHandle());
sfm.removeReadFD(s.getHandle());
}
+#endif