Changeset 709 for trunk/pdns/pdns/selectmplexer.cc
- Timestamp:
- 04/16/06 21:11:57 (7 years ago)
- Files:
-
- 1 modified
-
trunk/pdns/pdns/selectmplexer.cc (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/pdns/pdns/selectmplexer.cc
r707 r709 5 5 #include "misc.hh" 6 6 #include <boost/lexical_cast.hpp> 7 #include "syncres.hh" 7 8 8 9 using namespace boost; 10 using namespace std; 9 11 10 using namespace std; 12 class SelectFDMultiplexer : public FDMultiplexer 13 { 14 public: 15 SelectFDMultiplexer() 16 {} 17 virtual ~SelectFDMultiplexer() 18 {} 19 20 virtual int run(struct timeval* tv=0); 21 22 virtual void addFD(callbackmap_t& cbmap, int fd, callbackfunc_t toDo, boost::any parameter); 23 virtual void removeFD(callbackmap_t& cbmap, int fd); 24 }; 25 26 27 FDMultiplexer* getMultiplexer() 28 { 29 return new SelectFDMultiplexer(); 30 } 31 11 32 12 33 void SelectFDMultiplexer::addFD(callbackmap_t& cbmap, int fd, callbackfunc_t toDo, boost::any parameter) … … 15 36 cb.d_callback=toDo; 16 37 cb.d_parameter=parameter; 38 17 39 if(cbmap.count(fd)) 18 40 throw FDMultiplexerException("Tried to add fd "+lexical_cast<string>(fd)+ " to multiplexer twice"); … … 22 44 void SelectFDMultiplexer::removeFD(callbackmap_t& cbmap, int fd) 23 45 { 46 if(d_inrun && d_iter->first==fd) // trying to remove us! 47 d_iter++; 48 24 49 if(!cbmap.erase(fd)) 25 50 throw FDMultiplexerException("Tried to remove unlisted fd "+lexical_cast<string>(fd)+ " from multiplexer"); 26 51 } 27 52 28 29 53 int SelectFDMultiplexer::run(struct timeval* now) 30 54 { 55 if(d_inrun) { 56 throw FDMultiplexerException("FDMultiplexer::run() is not reentrant!\n"); 57 } 31 58 fd_set readfds, writefds; 32 59 FD_ZERO(&readfds); … … 39 66 fdmax=max(i->first, fdmax); 40 67 } 68 69 for(callbackmap_t::const_iterator i=d_writeCallbacks.begin(); i != d_writeCallbacks.end(); ++i) { 70 FD_SET(i->first, &writefds); 71 fdmax=max(i->first, fdmax); 72 } 73 41 74 42 75 struct timeval tv={0,500000}; … … 51 84 return 0; 52 85 86 d_iter=d_readCallbacks.end(); 53 87 d_inrun=true; 54 d_newReadCallbacks=d_readCallbacks; 55 d_newWriteCallbacks=d_writeCallbacks; 88 89 for(callbackmap_t::iterator i=d_readCallbacks.begin(); i != d_readCallbacks.end() && i->first <= fdmax; ) { 90 d_iter=i++; 56 91 57 for(callbackmap_t::iterator i=d_readCallbacks.begin(); i != d_readCallbacks.end(); ++i) { 58 if(FD_ISSET(i->first, &readfds)) 59 i->second.d_callback(i->first, i->second.d_parameter); 60 } 61 for(callbackmap_t::iterator i=d_writeCallbacks.begin(); i != d_writeCallbacks.end(); ++i) { 62 if(FD_ISSET(i->first, &writefds)) 63 i->second.d_callback(i->first, i->second.d_parameter); 92 if(FD_ISSET(d_iter->first, &readfds)) { 93 d_iter->second.d_callback(d_iter->first, d_iter->second.d_parameter); 94 } 64 95 } 65 96 66 d_readCallbacks.swap(d_newReadCallbacks); 67 d_writeCallbacks.swap(d_newWriteCallbacks); 97 for(callbackmap_t::iterator i=d_writeCallbacks.begin(); i != d_writeCallbacks.end() && i->first <= fdmax; ) { 98 d_iter=i++; 99 if(FD_ISSET(d_iter->first, &writefds)) { 100 d_iter->second.d_callback(d_iter->first, d_iter->second.d_parameter); 101 } 102 } 68 103 69 104 d_inrun=false; 70 71 105 return 0; 72 106 } 107 108 #if 0 73 109 74 110 void acceptData(int fd, boost::any& parameter) … … 82 118 } 83 119 84 #if 0 120 85 121 int main() 86 122 {