#include <iostream>
#include <unistd.h>
#include "misc.hh"
-#include "syncres.hh"
#ifdef __linux__
#include <sys/epoll.h>
#endif
-#include "namespaces.hh"
#include "namespaces.hh"
class EpollFDMultiplexer : public FDMultiplexer
close(d_epollfd);
}
- virtual int run(struct timeval* tv);
+ virtual int run(struct timeval* tv, int timeout=500) override;
+ virtual void getAvailableFDs(std::vector<int>& fds, int timeout) override;
- virtual void addFD(callbackmap_t& cbmap, int fd, callbackfunc_t toDo, const funcparam_t& parameter);
- virtual void removeFD(callbackmap_t& cbmap, int fd);
- string getName()
+ virtual void addFD(callbackmap_t& cbmap, int fd, callbackfunc_t toDo, const funcparam_t& parameter, const struct timeval* ttd=nullptr) override;
+ virtual void removeFD(callbackmap_t& cbmap, int fd) override;
+ string getName() const override
{
return "epoll";
}
}
} doItEpoll;
-
int EpollFDMultiplexer::s_maxevents=1024;
+
EpollFDMultiplexer::EpollFDMultiplexer() : d_eevents(new epoll_event[s_maxevents])
{
d_epollfd=epoll_create(s_maxevents); // not hard max
}
-void EpollFDMultiplexer::addFD(callbackmap_t& cbmap, int fd, callbackfunc_t toDo, const funcparam_t& parameter)
+void EpollFDMultiplexer::addFD(callbackmap_t& cbmap, int fd, callbackfunc_t toDo, const funcparam_t& parameter, const struct timeval* ttd)
{
- accountingAddFD(cbmap, fd, toDo, parameter);
+ accountingAddFD(cbmap, fd, toDo, parameter, ttd);
struct epoll_event eevent;
throw FDMultiplexerException("Removing fd from epoll set: "+stringerror());
}
-int EpollFDMultiplexer::run(struct timeval* now)
+void EpollFDMultiplexer::getAvailableFDs(std::vector<int>& fds, int timeout)
+{
+ int ret=epoll_wait(d_epollfd, d_eevents.get(), s_maxevents, timeout);
+
+ if(ret < 0 && errno!=EINTR)
+ throw FDMultiplexerException("epoll returned error: "+stringerror());
+
+ for(int n=0; n < ret; ++n) {
+ fds.push_back(d_eevents[n].data.fd);
+ }
+}
+
+int EpollFDMultiplexer::run(struct timeval* now, int timeout)
{
if(d_inrun) {
throw FDMultiplexerException("FDMultiplexer::run() is not reentrant!\n");
}
- int ret=epoll_wait(d_epollfd, d_eevents.get(), s_maxevents, 500);
+ int ret=epoll_wait(d_epollfd, d_eevents.get(), s_maxevents, timeout);
gettimeofday(now,0); // MANDATORY
-
+
if(ret < 0 && errno!=EINTR)
throw FDMultiplexerException("epoll returned error: "+stringerror());
d_iter=d_readCallbacks.find(d_eevents[n].data.fd);
if(d_iter != d_readCallbacks.end()) {
- d_iter->second.d_callback(d_iter->first, d_iter->second.d_parameter);
+ d_iter->d_callback(d_iter->d_fd, d_iter->d_parameter);
continue; // so we don't refind ourselves as writable!
}
d_iter=d_writeCallbacks.find(d_eevents[n].data.fd);
if(d_iter != d_writeCallbacks.end()) {
- d_iter->second.d_callback(d_iter->first, d_iter->second.d_parameter);
+ d_iter->d_callback(d_iter->d_fd, d_iter->d_parameter);
}
}
d_inrun=false;
- return 0;
+ return ret;
}
#if 0