diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-05-08 13:18:25 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-05-08 13:18:25 +0000 |
| commit | 2c54667beb2b05fe20a51f5e89fa3cb5e7d515f6 (patch) | |
| tree | d2dbb73c27ba90ffc94a1d23497ec9dc8e8a5c22 /src/DownloadEngine.cc | |
| parent | 8fab8859b124926138d26562c2b525e4a938cb23 (diff) | |
2008-05-08 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Added timeout to socket pool. The default timeout is 15 seconds,
which is the same value Apache uses.
* src/DownloadEngine.cc
* src/DownloadEngine.h
Diffstat (limited to 'src/DownloadEngine.cc')
| -rw-r--r-- | src/DownloadEngine.cc | 51 |
1 files changed, 38 insertions, 13 deletions
diff --git a/src/DownloadEngine.cc b/src/DownloadEngine.cc index c36fe7ef..6f8475ab 100644 --- a/src/DownloadEngine.cc +++ b/src/DownloadEngine.cc @@ -368,29 +368,36 @@ void DownloadEngine::addRoutineCommand(Command* command) } void DownloadEngine::poolSocket(const std::string& ipaddr, uint16_t port, - const SharedHandle<SocketCore>& sock) + const SharedHandle<SocketCore>& sock, + time_t timeout) { std::string addr = ipaddr+":"+Util::uitos(port); logger->info("Pool socket for %s", addr.c_str()); - std::multimap<std::string, SharedHandle<SocketCore> >::value_type newPair - (addr, sock); - _socketPool.insert(newPair); + + SocketPoolEntry e(sock, timeout); + std::multimap<std::string, SocketPoolEntry>::value_type p(addr, e); + _socketPool.insert(p); } SharedHandle<SocketCore> DownloadEngine::popPooledSocket(const std::string& ipaddr, uint16_t port) { + SharedHandle<SocketCore> s; std::string addr = ipaddr+":"+Util::uitos(port); - std::multimap<std::string, SharedHandle<SocketCore> >::iterator i = - _socketPool.find(addr); - if(i == _socketPool.end()) { - return SharedHandle<SocketCore>(); - } else { - logger->info("Reuse socket for %s", addr.c_str()); - SharedHandle<SocketCore> s = (*i).second; - _socketPool.erase(i); - return s; + + std::multimap<std::string, SocketPoolEntry>::iterator first = _socketPool.find(addr); + + for(std::multimap<std::string, SocketPoolEntry>::iterator i = first; + i != _socketPool.end() && (*i).first == addr; ++i) { + const SocketPoolEntry& e = (*i).second; + if(!e.isTimeout()) { + logger->info("Reuse socket for %s", addr.c_str()); + s = e.getSocket(); + _socketPool.erase(first, ++i); + break; + } } + return s; } SharedHandle<SocketCore> @@ -407,4 +414,22 @@ DownloadEngine::popPooledSocket return SharedHandle<SocketCore>(); } +DownloadEngine::SocketPoolEntry::SocketPoolEntry +(const SharedHandle<SocketCore>& socket, + time_t timeout): + _socket(socket), + _timeout(timeout) {} + +DownloadEngine::SocketPoolEntry::~SocketPoolEntry() {} + +bool DownloadEngine::SocketPoolEntry::isTimeout() const +{ + return _registeredTime.elapsed(_timeout); +} + +SharedHandle<SocketCore> DownloadEngine::SocketPoolEntry::getSocket() const +{ + return _socket; +} + } // namespace aria2 |
