Bladeren bron

2010-07-31 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

	Use hostname of original URI when counting hostname in
	inFlightRequest.
	* src/FileEntry.cc
Tatsuhiro Tsujikawa 15 jaren geleden
bovenliggende
commit
3a0f45ec8d
2 gewijzigde bestanden met toevoegingen van 32 en 18 verwijderingen
  1. 13 0
      ChangeLog
  2. 19 18
      src/FileEntry.cc

+ 13 - 0
ChangeLog

@@ -1,3 +1,16 @@
+2010-07-31  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	Use hostname of original URI when counting hostname in
+	inFlightRequest.
+	* src/FileEntry.cc
+
+2010-07-31  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	Fixed the bug that
+	AdaptiveFileAllocationIterator::getCurrentLength() does not return
+	updated allocated bytes.
+	* src/AdaptiveFileAllocationIterator.h
+
 2010-07-30  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 
 	Added FTP EPSV and EPRT command support. aria2 issues these

+ 19 - 18
src/FileEntry.cc

@@ -103,19 +103,17 @@ void FileEntry::getUris(std::vector<std::string>& uris) const
   uris.insert(uris.end(), uris_.begin(), uris_.end());
 }
 
-template<typename InputIterator>
-static size_t countInFlightHost(InputIterator first, InputIterator last,
-                                const std::string& hostname)
+template<typename InputIterator, typename OutputIterator>
+static OutputIterator
+enumerateInFlightHosts
+(InputIterator first, InputIterator last, OutputIterator out)
 {
-  // TODO redirection should be considered here. We need to parse
-  // original URI to get hostname.
-  size_t count = 0;
+  Request r;
   for(; first != last; ++first) {
-    if((*first)->getHost() == hostname) {
-      ++count;
-    }
+    r.setUri((*first)->getUri());
+    *out++ = r.getHost();
   }
-  return count;
+  return out;
 }
 
 SharedHandle<Request>
@@ -128,6 +126,10 @@ FileEntry::getRequest
 {
   SharedHandle<Request> req;
   Request r;
+  std::vector<std::string> inFlightHosts;
+  enumerateInFlightHosts(inFlightRequests_.begin(), inFlightRequests_.end(),
+                         std::back_inserter(inFlightHosts));
+
   if(!requestPool_.empty()) {
     for(std::deque<SharedHandle<Request> >::iterator i = requestPool_.begin(),
           eoi = requestPool_.end(); i != eoi; ++i) {
@@ -136,9 +138,9 @@ FileEntry::getRequest
          usedHosts.end()) {
         continue;
       }
-      if(countInFlightHost(inFlightRequests_.begin(), inFlightRequests_.end(),
-                           r.getHost()) >= maxConnectionPerServer_) {
-        continue;
+      if(std::count(inFlightHosts.begin(), inFlightHosts.end(), r.getHost())
+         >= static_cast<int>(maxConnectionPerServer_)) {
+      continue;
       }
       req = *i;
       requestPool_.erase(i);
@@ -157,9 +159,8 @@ FileEntry::getRequest
       }
       req.reset(new Request());
       if(req->setUri(uri)) {
-        if(countInFlightHost(inFlightRequests_.begin(),
-                             inFlightRequests_.end(),
-                             req->getHost()) >= maxConnectionPerServer_) {
+        if(std::count(inFlightHosts.begin(), inFlightHosts.end(),req->getHost())
+           >= static_cast<int>(maxConnectionPerServer_)) {
           pending.push_back(uri);
           ignoreHost.push_back(req->getHost());
           req.reset();
@@ -188,8 +189,8 @@ FileEntry::getRequest
     for(std::deque<SharedHandle<Request> >::iterator i = requestPool_.begin(),
           eoi = requestPool_.end(); i != eoi; ++i) {
       r.setUri((*i)->getUri());
-      if(countInFlightHost(inFlightRequests_.begin(), inFlightRequests_.end(),
-                           r.getHost()) >= maxConnectionPerServer_) {
+      if(std::count(inFlightHosts.begin(), inFlightHosts.end(), r.getHost())
+         >= static_cast<int>(maxConnectionPerServer_)) {
         continue;
       }
       req = *i;