From: Bert Hubert Date: Wed, 26 Jan 2011 00:12:50 +0000 (+0000) Subject: work in progress, but needed to complete the tar.gz build X-Git-Tag: auth-3.0~336 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cfa2996aea8225071d75c0cbeb370868100da758;p=pdns work in progress, but needed to complete the tar.gz build git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@1911 d19b8d6e-7fed-0310-83ef-9ca221ded41b --- diff --git a/pdns/pollmplexer.cc b/pdns/pollmplexer.cc new file mode 100644 index 000000000..793bfb0c3 --- /dev/null +++ b/pdns/pollmplexer.cc @@ -0,0 +1,132 @@ +#include "mplexer.hh" +#include "sstuff.hh" +#include +#include +#include "misc.hh" +#include +#include "syncres.hh" +#include "utility.hh" +#include "namespaces.hh" +using namespace std; + + +static FDMultiplexer* make() +{ + return new PollFDMultiplexer(); +} + +static struct RegisterOurselves +{ + RegisterOurselves() { + FDMultiplexer::getMultiplexerMap().insert(make_pair(1, &make)); + } +} doIt; + +void PollFDMultiplexer::addFD(callbackmap_t& cbmap, int fd, callbackfunc_t toDo, const boost::any& parameter) +{ + Callback cb; + cb.d_callback=toDo; + cb.d_parameter=parameter; + memset(&cb.d_ttd, 0, sizeof(cb.d_ttd)); + if(cbmap.count(fd)) + throw FDMultiplexerException("Tried to add fd "+lexical_cast(fd)+ " to multiplexer twice"); + cbmap[fd]=cb; +} + +void PollFDMultiplexer::removeFD(callbackmap_t& cbmap, int fd) +{ + if(d_inrun && d_iter->first==fd) // trying to remove us! + d_iter++; + + if(!cbmap.erase(fd)) + throw FDMultiplexerException("Tried to remove unlisted fd "+lexical_cast(fd)+ " from multiplexer"); +} + +bool pollfdcomp(const struct pollfd& a, const struct pollfd& b) +{ + return a.fd < b.fd; +} + +int PollFDMultiplexer::run(struct timeval* now) +{ + if(d_inrun) { + throw FDMultiplexerException("FDMultiplexer::run() is not reentrant!\n"); + } + + vector pollfds; + + struct pollfd pollfd; + for(callbackmap_t::const_iterator i=d_readCallbacks.begin(); i != d_readCallbacks.end(); ++i) { + pollfd.fd = i->first; + pollfd.events = POLLIN; + pollfds.push_back(pollfd); + } + + for(callbackmap_t::const_iterator i=d_writeCallbacks.begin(); i != d_writeCallbacks.end(); ++i) { + pollfd.fd = i->first; + pollfd.events = POLLOUT; + pollfds.push_back(pollfd); + } + + int ret=poll(&pollfds[0], pollfds.size(), 500); + Utility::gettimeofday(now, 0); // MANDATORY! + + if(ret < 0 && errno!=EINTR) + throw FDMultiplexerException("poll returned error: "+stringerror()); + + d_iter=d_readCallbacks.end(); + d_inrun=true; + + for(unsigned int n = 0; n < pollfds.size(); ++n) { + if(pollfds[n].revents == POLLIN) { + d_iter=d_readCallbacks.find(pollfds[n].fd); + + if(d_iter != d_readCallbacks.end()) { + d_iter->second.d_callback(d_iter->first, d_iter->second.d_parameter); + continue; // so we don't refind ourselves as writable! + } + } + else if(pollfds[n].revents == POLLOUT) { + d_iter=d_writeCallbacks.find(pollfds[n].fd); + + if(d_iter != d_writeCallbacks.end()) { + d_iter->second.d_callback(d_iter->first, d_iter->second.d_parameter); + } + } + } + d_inrun=false; + return 0; +} + +#if 0 + +void acceptData(int fd, boost::any& parameter) +{ + cout<<"Have data on fd "<(parameter); + string packet; + IPEndpoint rem; + sock->recvFrom(packet, rem); + cout<<"Received "<