| 154 | } |
| 155 | |
| 156 | int connect_pool::check_idle(time_t ttl, bool exclusive /* = true */) |
| 157 | { |
| 158 | if (ttl < 0) |
| 159 | return 0; |
| 160 | if (exclusive) |
| 161 | lock_->lock(); |
| 162 | if (pool_.empty()) |
| 163 | { |
| 164 | lock_->unlock(); |
| 165 | return 0; |
| 166 | } |
| 167 | |
| 168 | if (ttl == 0) |
| 169 | { |
| 170 | int n = 0; |
| 171 | std::list<connect_client*>::iterator it = pool_.begin(); |
| 172 | for (; it != pool_.end(); ++it) |
| 173 | { |
| 174 | delete *it; |
| 175 | n++; |
| 176 | }; |
| 177 | pool_.clear(); |
| 178 | count_ = 0; |
| 179 | lock_->unlock(); |
| 180 | return n; |
| 181 | } |
| 182 | |
| 183 | int n = 0; |
| 184 | time_t now = time(NULL), when; |
| 185 | |
| 186 | std::list<connect_client*>::iterator it, next; |
| 187 | std::list<connect_client*>::reverse_iterator rit = pool_.rbegin(); |
| 188 | |
| 189 | for (; rit != pool_.rend();) |
| 190 | { |
| 191 | it = --rit.base(); |
| 192 | when = (*it)->get_when(); |
| 193 | if (when <= 0) |
| 194 | { |
| 195 | ++rit; |
| 196 | continue; |
| 197 | } |
| 198 | |
| 199 | if (now - when < ttl) |
| 200 | break; |
| 201 | |
| 202 | delete *it; |
| 203 | next = pool_.erase(it); |
| 204 | rit = std::list<connect_client*>::reverse_iterator(next); |
| 205 | |
| 206 | n++; |
| 207 | count_--; |
| 208 | } |
| 209 | |
| 210 | lock_->unlock(); |
| 211 | return n; |
| 212 | } |
| 213 | |