From 2bea8759c443ea74d432d4b96a8789b0e916447c Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Fri, 31 Aug 2007 15:18:48 +0000 Subject: [PATCH] 2007-09-01 Tatsuhiro Tsujikawa Reduced the fragmentation of bitfield in http/ftp download. * src/BitfieldMan.cc (getSparseMissingUnusedIndex) * test/BitfieldManTest.cc --- ChangeLog | 6 ++++++ src/BitfieldMan.cc | 4 +++- test/BitfieldManTest.cc | 38 +++++++++++++++++++++++++++++++++----- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3f07a357..9ebc19e6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2007-09-01 Tatsuhiro Tsujikawa + + Reduced the fragmentation of bitfield in http/ftp download. + * src/BitfieldMan.cc (getSparseMissingUnusedIndex) + * test/BitfieldManTest.cc + 2007-08-30 Tatsuhiro Tsujikawa Added the ability to disable segmented download in .metalink. diff --git a/src/BitfieldMan.cc b/src/BitfieldMan.cc index 38e6f036..32f3a99c 100644 --- a/src/BitfieldMan.cc +++ b/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; diff --git a/test/BitfieldManTest.cc b/test/BitfieldManTest.cc index b0124545..2418ed34 100644 --- a/test/BitfieldManTest.cc +++ b/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());