Show
Ignore:
Timestamp:
04/16/06 21:11:57 (7 years ago)
Author:
ahu
Message:

add epoll mplexer, update selectmplexer

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/pdns/pdns/selectmplexer.cc

    r707 r709  
    55#include "misc.hh" 
    66#include <boost/lexical_cast.hpp> 
     7#include "syncres.hh" 
    78 
    89using namespace boost; 
     10using namespace std; 
    911 
    10 using namespace std; 
     12class SelectFDMultiplexer : public FDMultiplexer 
     13{ 
     14public: 
     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 
     27FDMultiplexer* getMultiplexer() 
     28{ 
     29  return new SelectFDMultiplexer(); 
     30} 
     31 
    1132 
    1233void SelectFDMultiplexer::addFD(callbackmap_t& cbmap, int fd, callbackfunc_t toDo, boost::any parameter) 
     
    1536  cb.d_callback=toDo; 
    1637  cb.d_parameter=parameter; 
     38 
    1739  if(cbmap.count(fd)) 
    1840    throw FDMultiplexerException("Tried to add fd "+lexical_cast<string>(fd)+ " to multiplexer twice"); 
     
    2244void SelectFDMultiplexer::removeFD(callbackmap_t& cbmap, int fd) 
    2345{ 
     46  if(d_inrun && d_iter->first==fd)  // trying to remove us! 
     47    d_iter++; 
     48 
    2449  if(!cbmap.erase(fd)) 
    2550    throw FDMultiplexerException("Tried to remove unlisted fd "+lexical_cast<string>(fd)+ " from multiplexer"); 
    2651} 
    2752 
    28  
    2953int SelectFDMultiplexer::run(struct timeval* now) 
    3054{ 
     55  if(d_inrun) { 
     56    throw FDMultiplexerException("FDMultiplexer::run() is not reentrant!\n"); 
     57  } 
    3158  fd_set readfds, writefds; 
    3259  FD_ZERO(&readfds); 
     
    3966    fdmax=max(i->first, fdmax); 
    4067  } 
     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 
    4174   
    4275  struct timeval tv={0,500000}; 
     
    5184    return 0; 
    5285 
     86  d_iter=d_readCallbacks.end(); 
    5387  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++; 
    5691 
    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    } 
    6495  } 
    6596 
    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  } 
    68103 
    69104  d_inrun=false; 
    70    
    71105  return 0; 
    72106} 
     107 
     108#if 0 
    73109 
    74110void acceptData(int fd, boost::any& parameter) 
     
    82118} 
    83119 
    84 #if 0 
     120 
    85121int main() 
    86122{