Changeset 4897 for branches/erijo-dev

Show
Ignore:
Timestamp:
04/29/07 22:35:45 (19 months ago)
Author:
erijo
Message:

Handle invalid fds and fix up iterator usage.

Location:
branches/erijo-dev/licq/src/event
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • branches/erijo-dev/licq/src/event/eventloop.cpp

    r4888 r4897  
    131131    { 
    132132      // Error 
    133       if (errno == EINTR) 
    134         continue; 
    135       else 
     133      switch (errno) 
     134      { 
     135      case EINTR: 
     136        break; 
     137      case EBADF: 
     138        Impl->ReadFdSet.removeInvalidFds(); 
     139        Impl->WriteFdSet.removeInvalidFds(); 
     140        break; 
     141      default: 
    136142        this->exit(errno); 
     143        break; 
     144      } 
     145 
     146      continue; 
    137147    } 
    138148    else 
  • branches/erijo-dev/licq/src/event/fdset.cpp

    r4888 r4897  
    2121#include "utils/misc.h" 
    2222 
     23#include <cerrno> 
     24#include <fcntl.h> 
     25#include <functional> 
     26#include <unistd.h> 
     27 
     28static bool isValidFd(int fd) 
     29{ 
     30  if (::fcntl(fd, F_GETFD) == -1 && errno == EBADF) 
     31    return false; 
     32 
     33  return true; 
     34} 
     35 
     36struct InvalidFd : public std::unary_function<const Licq::TFdSet::TFdSetData*, bool> 
     37{ 
     38  bool operator()(const Licq::TFdSet::TFdSetData* data) const 
     39  { 
     40    return !isValidFd(data->Fd); 
     41  } 
     42}; 
     43 
     44struct IsFd : public std::unary_function<const Licq::TFdSet::TFdSetData*, bool> 
     45{ 
     46  int Fd; 
     47  IsFd(int fd) : Fd(fd) {} 
     48  bool operator()(const Licq::TFdSet::TFdSetData* data) const 
     49  { 
     50    return (data->Fd == Fd); 
     51  } 
     52}; 
     53 
    2354void Licq::TFdSet::addRemoveFds() 
    2455{ 
     
    3263    for (TFds::const_iterator it = RemoveFds.begin(); it != RemoveFds.end(); ++it) 
    3364    { 
    34       for (TFds::iterator fd = Fds.begin(); fd != Fds.end(); ++fd) 
     65      for (TFds::iterator fd = Fds.begin(), end = Fds.end(); fd != end; ++fd) 
    3566      { 
    3667        if (*fd == *it) 
     
    4980  if (!AddFds.empty()) 
    5081  { 
    51     for (TFds::const_iterator it = AddFds.begin(); it != AddFds.end(); ++it) 
     82    for (TFds::const_iterator it = AddFds.begin(), end = AddFds.end(); 
     83         it != end; ++it) 
    5284    { 
    5385      Fds.push_back(*it); 
     
    6496    FD_ZERO(&FdSet); 
    6597 
    66     for (TFds::const_iterator it = Fds.begin(); it != Fds.end(); ++it) 
     98    for (TFds::const_iterator it = Fds.begin(), end = Fds.end(); it != end; ++it) 
    6799    { 
    68100      FD_SET((*it)->Fd, &FdSet); 
     
    85117void Licq::TFdSet::addFd(int fd, IFileDescriptorHandler* handler) 
    86118{ 
     119  if (!isValidFd(fd) || fd >= FD_SETSIZE || fd < 0) 
     120    return; 
     121 
    87122  TFdSetData* data = new TFdSetData; 
    88123  data->Fd = fd; 
     
    95130void Licq::TFdSet::removeFd(int fd) 
    96131{ 
    97   for (TFds::iterator it = Fds.begin(); it != Fds.end(); ++it) 
     132  for (TFds::iterator it = Fds.begin(), end = Fds.end(); it != end; ++it) 
    98133  { 
    99134    if ((*it)->Fd == fd) 
     
    101136  } 
    102137 
    103   for (TFds::iterator it = AddFds.begin(); it != AddFds.end(); ++it) 
    104   { 
    105     if ((*it)->Fd == fd) 
    106     { 
    107       delete *it; 
    108       AddFds.erase(it); 
    109     } 
    110   } 
     138  TFds::iterator end = std::remove_if(AddFds.begin(), AddFds.end(), IsFd(fd)); 
     139  std::for_each(end, AddFds.end(), ObjectDeleter()); 
     140  AddFds.erase(end, AddFds.end()); 
    111141 
    112142  addRemoveFds(); 
     
    124154  InFireActive = true; 
    125155 
    126   for (TFds::const_iterator it = Fds.begin(); it != Fds.end(); ++it) 
     156  for (TFds::const_iterator it = Fds.begin(), end = Fds.end(); it != end; ++it) 
    127157  { 
    128158    if (FD_ISSET((*it)->Fd, &set)) 
     
    133163  addRemoveFds(); 
    134164} 
     165 
     166void Licq::TFdSet::removeInvalidFds() 
     167{ 
     168  TFds::iterator end = std::remove_if(Fds.begin(), Fds.end(), InvalidFd()); 
     169  std::for_each(end, Fds.end(), ObjectDeleter()); 
     170  Fds.erase(end, Fds.end()); 
     171} 
  • branches/erijo-dev/licq/src/event/fdset.h

    r4887 r4897  
    3131class TFdSet 
    3232{ 
    33 private: 
    34   bool InFireActive; 
    35  
     33public: 
    3634  struct TFdSetData 
    3735  { 
     
    3937    IFileDescriptorHandler* FileDescriptorHandler; 
    4038  }; 
     39 
     40private: 
     41  bool InFireActive; 
    4142 
    4243  typedef std::vector<TFdSetData*> TFds; 
     
    6263  int getFdSet(fd_set* set) const; 
    6364  void fireActive(const fd_set& set); 
     65  void removeInvalidFds(); 
    6466}; 
    6567