Browse Source

Fix bug that numOpenFile_ is not reduced when MultiDiskAdaptor is deleted

This bug caused assertion error in RequestGroupMan::ensureMaxOpenFileLimit
Tatsuhiro Tsujikawa 11 years ago
parent
commit
8216bdba79
3 changed files with 18 additions and 2 deletions
  1. 10 2
      src/MultiDiskAdaptor.cc
  2. 6 0
      src/RequestGroupMan.cc
  3. 2 0
      src/RequestGroupMan.h

+ 10 - 2
src/MultiDiskAdaptor.cc

@@ -124,7 +124,10 @@ MultiDiskAdaptor::MultiDiskAdaptor()
     readOnly_{false}
 {}
 
-MultiDiskAdaptor::~MultiDiskAdaptor() {}
+MultiDiskAdaptor::~MultiDiskAdaptor()
+{
+  closeFile();
+}
 
 namespace {
 std::unique_ptr<DiskWriterEntry> createDiskWriterEntry
@@ -267,10 +270,15 @@ void MultiDiskAdaptor::openExistingFile()
 
 void MultiDiskAdaptor::closeFile()
 {
+  size_t n = 0;
   openedDiskWriterEntries_.clear();
   for(auto& dwent : diskWriterEntries_) {
-    dwent->closeFile();
+    if(dwent->isOpen()) {
+      ++n;
+      dwent->closeFile();
+    }
   }
+  getRequestGroupMan()->reduceNumOfOpenedFile(n);
 }
 
 namespace {

+ 6 - 0
src/RequestGroupMan.cc

@@ -985,4 +985,10 @@ void RequestGroupMan::ensureMaxOpenFileLimit(size_t numNewFile)
   numOpenFile_ += numNewFile - numClose;
 }
 
+void RequestGroupMan::reduceNumOfOpenedFile(size_t numCloseFile)
+{
+  assert(numOpenFile_ >= numCloseFile);
+  numOpenFile_ -= numCloseFile;
+}
+
 } // namespace aria2

+ 2 - 0
src/RequestGroupMan.h

@@ -357,6 +357,8 @@ public:
   // Currently the only download using MultiDiskAdaptor is affected by
   // the global limit.
   void ensureMaxOpenFileLimit(size_t numNewFile);
+  // Reduces the number of open files managed by this object.
+  void reduceNumOfOpenedFile(size_t numCloseFile);
 };
 
 } // namespace aria2