Kaynağa Gözat

2008-09-07 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

	Fixed the bug that exception is thrown when 
MultiDiskAdaptor::size() is
	called if the number of file entries are greater than max open 
files.
	* src/AbstractSingleDiskAdaptor.cc
	* src/AbstractSingleDiskAdaptor.h
	* src/DiskAdaptor.h
	* src/MultiDiskAdaptor.cc
	* src/MultiDiskAdaptor.h
	* test/MultiDiskAdaptorTest.cc
Tatsuhiro Tsujikawa 17 yıl önce
ebeveyn
işleme
390538d0b5

+ 11 - 0
ChangeLog

@@ -1,3 +1,14 @@
+2008-09-07  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
+
+	Fixed the bug that exception is thrown when MultiDiskAdaptor::size() is
+	called if the number of file entries are greater than max open files.
+	* src/AbstractSingleDiskAdaptor.cc
+	* src/AbstractSingleDiskAdaptor.h
+	* src/DiskAdaptor.h
+	* src/MultiDiskAdaptor.cc
+	* src/MultiDiskAdaptor.h
+	* test/MultiDiskAdaptorTest.cc
+
 2008-09-07  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
 
 	Added a constuctor that receives struct timeval.

+ 1 - 1
src/AbstractSingleDiskAdaptor.cc

@@ -78,7 +78,7 @@ bool AbstractSingleDiskAdaptor::fileExists()
   return File(getFilePath()).exists();
 }
 
-uint64_t AbstractSingleDiskAdaptor::size() const
+uint64_t AbstractSingleDiskAdaptor::size()
 {
   return diskWriter->size();
 }

+ 1 - 1
src/AbstractSingleDiskAdaptor.h

@@ -66,7 +66,7 @@ public:
 
   virtual bool fileExists();
 
-  virtual uint64_t size() const;
+  virtual uint64_t size();
 
   virtual void truncate(uint64_t length);
   

+ 1 - 1
src/DiskAdaptor.h

@@ -68,7 +68,7 @@ public:
 
   virtual std::string getFilePath() = 0;
 
-  virtual uint64_t size() const = 0;
+  virtual uint64_t size() = 0;
 
   // optional behavior
   virtual void truncate(uint64_t length) {}

+ 2 - 1
src/MultiDiskAdaptor.cc

@@ -411,11 +411,12 @@ bool MultiDiskAdaptor::fileExists()
 }
 
 // TODO call DiskWriter::openFile() before calling this function.
-uint64_t MultiDiskAdaptor::size() const
+uint64_t MultiDiskAdaptor::size()
 {
   uint64_t size = 0;
   for(DiskWriterEntries::const_iterator itr = diskWriterEntries.begin();
       itr != diskWriterEntries.end(); ++itr) {
+    openIfNot(*itr, &DiskWriterEntry::openFile, _cachedTopDirPath);
     size += (*itr)->size();
   }
   return size;

+ 1 - 1
src/MultiDiskAdaptor.h

@@ -147,7 +147,7 @@ public:
     return getTopDirPath();
   }
 
-  virtual uint64_t size() const;
+  virtual uint64_t size();
 
   virtual SharedHandle<FileAllocationIterator> fileAllocationIterator();
 

+ 30 - 0
test/MultiDiskAdaptorTest.cc

@@ -17,6 +17,7 @@ class MultiDiskAdaptorTest:public CppUnit::TestFixture {
   CPPUNIT_TEST(testWriteData);
   CPPUNIT_TEST(testReadData);
   CPPUNIT_TEST(testCutTrailingGarbage);
+  CPPUNIT_TEST(testSize);
   CPPUNIT_TEST_SUITE_END();
 private:
   SharedHandle<MultiDiskAdaptor> adaptor;
@@ -31,6 +32,7 @@ public:
   void testWriteData();
   void testReadData();
   void testCutTrailingGarbage();
+  void testSize();
 };
 
 
@@ -167,4 +169,32 @@ void MultiDiskAdaptorTest::testCutTrailingGarbage()
 		       File(topDirPath+"/"+entries[1]->getPath()).size());
 }
 
+void MultiDiskAdaptorTest::testSize()
+{
+  std::string dir = "/tmp";
+  std::string topDir = ".";
+  std::string topDirPath = dir+"/"+topDir;
+  std::string prefix = "aria2_MultiDiskAdaptorTest_testSize_";
+  SharedHandle<FileEntry> entries[] = {
+    SharedHandle<FileEntry>(new FileEntry(prefix+"1", 1, 0)),
+    SharedHandle<FileEntry>(new FileEntry(prefix+"2", 1, 1))
+  };
+  for(size_t i = 0; i < arrayLength(entries); ++i) {
+    createFile(topDirPath+"/"+entries[i]->getPath(),
+	       entries[i]->getLength());
+  }
+  std::deque<SharedHandle<FileEntry> > fileEntries
+    (&entries[0], &entries[arrayLength(entries)]);
+  
+  MultiDiskAdaptor adaptor;
+  adaptor.setStoreDir(dir);
+  adaptor.setTopDir(topDir);
+  adaptor.setFileEntries(fileEntries);
+  adaptor.setMaxOpenFiles(1);
+  
+  adaptor.openFile();
+
+  CPPUNIT_ASSERT_EQUAL((uint64_t)2, adaptor.size());
+}
+
 } // namespace aria2