Changeset 4897 for branches/erijo-dev
- Timestamp:
- 04/29/07 22:35:45 (19 months ago)
- Location:
- branches/erijo-dev/licq/src/event
- Files:
-
- 3 modified
Legend:
- Unmodified
- Added
- Removed
-
branches/erijo-dev/licq/src/event/eventloop.cpp
r4888 r4897 131 131 { 132 132 // 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: 136 142 this->exit(errno); 143 break; 144 } 145 146 continue; 137 147 } 138 148 else -
branches/erijo-dev/licq/src/event/fdset.cpp
r4888 r4897 21 21 #include "utils/misc.h" 22 22 23 #include <cerrno> 24 #include <fcntl.h> 25 #include <functional> 26 #include <unistd.h> 27 28 static bool isValidFd(int fd) 29 { 30 if (::fcntl(fd, F_GETFD) == -1 && errno == EBADF) 31 return false; 32 33 return true; 34 } 35 36 struct 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 44 struct 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 23 54 void Licq::TFdSet::addRemoveFds() 24 55 { … … 32 63 for (TFds::const_iterator it = RemoveFds.begin(); it != RemoveFds.end(); ++it) 33 64 { 34 for (TFds::iterator fd = Fds.begin() ; fd != Fds.end(); ++fd)65 for (TFds::iterator fd = Fds.begin(), end = Fds.end(); fd != end; ++fd) 35 66 { 36 67 if (*fd == *it) … … 49 80 if (!AddFds.empty()) 50 81 { 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) 52 84 { 53 85 Fds.push_back(*it); … … 64 96 FD_ZERO(&FdSet); 65 97 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) 67 99 { 68 100 FD_SET((*it)->Fd, &FdSet); … … 85 117 void Licq::TFdSet::addFd(int fd, IFileDescriptorHandler* handler) 86 118 { 119 if (!isValidFd(fd) || fd >= FD_SETSIZE || fd < 0) 120 return; 121 87 122 TFdSetData* data = new TFdSetData; 88 123 data->Fd = fd; … … 95 130 void Licq::TFdSet::removeFd(int fd) 96 131 { 97 for (TFds::iterator it = Fds.begin() ; it != Fds.end(); ++it)132 for (TFds::iterator it = Fds.begin(), end = Fds.end(); it != end; ++it) 98 133 { 99 134 if ((*it)->Fd == fd) … … 101 136 } 102 137 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()); 111 141 112 142 addRemoveFds(); … … 124 154 InFireActive = true; 125 155 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) 127 157 { 128 158 if (FD_ISSET((*it)->Fd, &set)) … … 133 163 addRemoveFds(); 134 164 } 165 166 void 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 31 31 class TFdSet 32 32 { 33 private: 34 bool InFireActive; 35 33 public: 36 34 struct TFdSetData 37 35 { … … 39 37 IFileDescriptorHandler* FileDescriptorHandler; 40 38 }; 39 40 private: 41 bool InFireActive; 41 42 42 43 typedef std::vector<TFdSetData*> TFds; … … 62 63 int getFdSet(fd_set* set) const; 63 64 void fireActive(const fd_set& set); 65 void removeInvalidFds(); 64 66 }; 65 67
