瀏覽代碼

2007-09-01 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

	Reduced the fragmentation of bitfield in http/ftp download.
	* src/BitfieldMan.cc (getSparseMissingUnusedIndex)
	* test/BitfieldManTest.cc
Tatsuhiro Tsujikawa 18 年之前
父節點
當前提交
2bea8759c4
共有 3 個文件被更改,包括 42 次插入6 次删除
  1. 6 0
      ChangeLog
  2. 3 1
      src/BitfieldMan.cc
  3. 33 5
      test/BitfieldManTest.cc

+ 6 - 0
ChangeLog

@@ -1,3 +1,9 @@
+2007-09-01  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
+
+	Reduced the fragmentation of bitfield in http/ftp download.
+	* src/BitfieldMan.cc (getSparseMissingUnusedIndex)
+	* test/BitfieldManTest.cc
+
 2007-08-30  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
 
 	Added the ability to disable segmented download in .metalink.

+ 3 - 1
src/BitfieldMan.cc

@@ -336,8 +336,10 @@ int32_t BitfieldMan::getSparseMissingUnusedIndex() const {
   if(maxRange.getSize()) {
     if(maxRange.startIndex == 0) {
       return 0;
+    } else if(isUseBitSet(maxRange.startIndex-1)) {
+      return maxRange.getMidIndex();      
     } else {
-      return maxRange.getMidIndex();
+      return maxRange.startIndex;
     }
   } else {
     return -1;

+ 33 - 5
test/BitfieldManTest.cc

@@ -15,6 +15,7 @@ class BitfieldManTest:public CppUnit::TestFixture {
   CPPUNIT_TEST(testFilter);
   CPPUNIT_TEST(testGetMissingIndex);
   CPPUNIT_TEST(testGetSparceMissingUnusedIndex);
+  CPPUNIT_TEST(testGetSparceMissingUnusedIndex_setBit);
   CPPUNIT_TEST(testIsBitSetOffsetRange);
   CPPUNIT_TEST(testGetMissingUnusedLength);
   CPPUNIT_TEST(testSetBitRange);
@@ -38,6 +39,7 @@ public:
   void testFilter();
   void testGetMissingIndex();
   void testGetSparceMissingUnusedIndex();
+  void testGetSparceMissingUnusedIndex_setBit();
   void testIsBitSetOffsetRange();
   void testGetMissingUnusedLength();
   void testSetBitRange();
@@ -221,23 +223,49 @@ void BitfieldManTest::testGetSparceMissingUnusedIndex() {
   BitfieldMan bitfield(1024*1024, 10*1024*1024);
 
   CPPUNIT_ASSERT_EQUAL((int32_t)0, bitfield.getSparseMissingUnusedIndex());
-  bitfield.setBit(0);
+  bitfield.setUseBit(0);
   CPPUNIT_ASSERT_EQUAL((int32_t)5, bitfield.getSparseMissingUnusedIndex());
   bitfield.setUseBit(5);
   CPPUNIT_ASSERT_EQUAL((int32_t)3, bitfield.getSparseMissingUnusedIndex());
-  bitfield.setBit(3);
+  bitfield.setUseBit(3);
   CPPUNIT_ASSERT_EQUAL((int32_t)8, bitfield.getSparseMissingUnusedIndex());
-  bitfield.setBit(8);
+  bitfield.setUseBit(8);
   CPPUNIT_ASSERT_EQUAL((int32_t)2, bitfield.getSparseMissingUnusedIndex());
-  bitfield.setBit(2);
+  bitfield.setUseBit(2);
   CPPUNIT_ASSERT_EQUAL((int32_t)7, bitfield.getSparseMissingUnusedIndex());
-  bitfield.setBit(7);
+  bitfield.setUseBit(7);
+  CPPUNIT_ASSERT_EQUAL((int32_t)1, bitfield.getSparseMissingUnusedIndex());
+  bitfield.setUseBit(1);
+  CPPUNIT_ASSERT_EQUAL((int32_t)4, bitfield.getSparseMissingUnusedIndex());
+  bitfield.setUseBit(4);
+  CPPUNIT_ASSERT_EQUAL((int32_t)6, bitfield.getSparseMissingUnusedIndex());
+  bitfield.setUseBit(6);
+  CPPUNIT_ASSERT_EQUAL((int32_t)9, bitfield.getSparseMissingUnusedIndex());
+  bitfield.setUseBit(9);
+  CPPUNIT_ASSERT_EQUAL((int32_t)-1, bitfield.getSparseMissingUnusedIndex());
+}
+
+void BitfieldManTest::testGetSparceMissingUnusedIndex_setBit() {
+  BitfieldMan bitfield(1024*1024, 10*1024*1024);
+
+  CPPUNIT_ASSERT_EQUAL((int32_t)0, bitfield.getSparseMissingUnusedIndex());
+  bitfield.setBit(0);
   CPPUNIT_ASSERT_EQUAL((int32_t)1, bitfield.getSparseMissingUnusedIndex());
   bitfield.setBit(1);
+  CPPUNIT_ASSERT_EQUAL((int32_t)2, bitfield.getSparseMissingUnusedIndex());
+  bitfield.setBit(2);
+  CPPUNIT_ASSERT_EQUAL((int32_t)3, bitfield.getSparseMissingUnusedIndex());
+  bitfield.setBit(3);
   CPPUNIT_ASSERT_EQUAL((int32_t)4, bitfield.getSparseMissingUnusedIndex());
   bitfield.setBit(4);
+  CPPUNIT_ASSERT_EQUAL((int32_t)5, bitfield.getSparseMissingUnusedIndex());
+  bitfield.setBit(5);
   CPPUNIT_ASSERT_EQUAL((int32_t)6, bitfield.getSparseMissingUnusedIndex());
   bitfield.setBit(6);
+  CPPUNIT_ASSERT_EQUAL((int32_t)7, bitfield.getSparseMissingUnusedIndex());
+  bitfield.setBit(7);
+  CPPUNIT_ASSERT_EQUAL((int32_t)8, bitfield.getSparseMissingUnusedIndex());
+  bitfield.setBit(8);
   CPPUNIT_ASSERT_EQUAL((int32_t)9, bitfield.getSparseMissingUnusedIndex());
   bitfield.setBit(9);
   CPPUNIT_ASSERT_EQUAL((int32_t)-1, bitfield.getSparseMissingUnusedIndex());