d_epollfd=epoll_create(s_maxevents); // not hard max
if(d_epollfd < 0)
throw FDMultiplexerException("Setting up epoll: "+stringerror());
+ int fd=socket(AF_INET, SOCK_DGRAM, 0); // for self-test
+ if(fd < 0)
+ return;
+ try {
+ addReadFD(fd, 0);
+ removeReadFD(fd);
+ close(fd);
+ return;
+ }
+ catch(FDMultiplexerException &fe) {
+ close(fd);
+ throw FDMultiplexerException("epoll multiplexer failed self-test: "+string(fe.what()));
+ }
+
}
void EpollFDMultiplexer::addFD(callbackmap_t& cbmap, int fd, callbackfunc_t toDo, const boost::any& parameter)
int socklen=sin.sin4.sin_family==AF_INET ? sizeof(sin.sin4) : sizeof(sin.sin6);
if (::bind(fd, (struct sockaddr *)&sin, socklen)<0)
- throw AhuException("Resolver binding to server socket for "+*i+": "+stringerror());
+ throw AhuException("Resolver binding to server socket on port "+::arg()["local-port"]+" for "+*i+": "+stringerror());
Utility::setNonBlocking(fd);
// g_fdm->addReadFD(fd, handleNewUDPQuestion);
L<<Logger::Error<<"Enabled '"<<ret->getName()<<"' multiplexer"<<endl;
return ret;
}
- catch(...)
- {}
+ catch(FDMultiplexerException &fe) {
+ L<<Logger::Error<<"Non-fatal error initializing possible multiplexer: "<<fe.what()<<endl;
+ }
+ catch(...) {
+ L<<Logger::Error<<"Non-fatal error initializing possible multiplexer"<<endl;
+ }
}
L<<Logger::Error<<"No working multiplexer found!"<<endl;
exit(1);