summaryrefslogtreecommitdiff
path: root/src/DownloadEngine.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-05-08 13:18:25 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-05-08 13:18:25 +0000
commit2c54667beb2b05fe20a51f5e89fa3cb5e7d515f6 (patch)
treed2dbb73c27ba90ffc94a1d23497ec9dc8e8a5c22 /src/DownloadEngine.cc
parent8fab8859b124926138d26562c2b525e4a938cb23 (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.cc51
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