Added PieceStorage::onDownloadIncomplete() virtual function.

In DefaultPieceStorage::onDownloadIncomplete(), we call
StreamPieceSelector::onBitfieldInit().
Added GeomStreamPieceSelectorTest.
pull/2/head
Tatsuhiro Tsujikawa 2011-08-24 23:16:06 +09:00
parent b94bf3355b
commit c7ac147287
16 changed files with 99 additions and 5 deletions

View File

@ -51,11 +51,12 @@ BtCheckIntegrityEntry::~BtCheckIntegrityEntry() {}
void BtCheckIntegrityEntry::onDownloadIncomplete
(std::vector<Command*>& commands, DownloadEngine* e)
{
const SharedHandle<PieceStorage>& ps = getRequestGroup()->getPieceStorage();
ps->onDownloadIncomplete();
if(getRequestGroup()->getOption()->getAsBool(PREF_HASH_CHECK_ONLY)) {
return;
}
const SharedHandle<DiskAdaptor>& diskAdaptor =
getRequestGroup()->getPieceStorage()->getDiskAdaptor();
const SharedHandle<DiskAdaptor>& diskAdaptor = ps->getDiskAdaptor();
if(diskAdaptor->isReadOnlyEnabled()) {
// Now reopen DiskAdaptor with read only disabled.
diskAdaptor->closeFile();

View File

@ -810,4 +810,9 @@ size_t DefaultPieceStorage::getNextUsedIndex(size_t index)
return bitfieldMan_->countBlock();
}
void DefaultPieceStorage::onDownloadIncomplete()
{
streamPieceSelector_->onBitfieldInit();
}
} // namespace aria2

View File

@ -272,6 +272,8 @@ public:
virtual size_t getNextUsedIndex(size_t index);
virtual void onDownloadIncomplete();
/**
* This method is made private for test purpose only.
*/

View File

@ -54,4 +54,6 @@ bool DefaultStreamPieceSelector::select
(index, minSplitSize, ignoreBitfield, length);
}
void DefaultStreamPieceSelector::onBitfieldInit() {}
} // namespace aria2

View File

@ -51,6 +51,8 @@ public:
size_t minSplitSize,
const unsigned char* ignoreBitfield,
size_t length);
virtual void onBitfieldInit();
private:
BitfieldMan* bitfieldMan_;
};

View File

@ -41,7 +41,8 @@ GeomStreamPieceSelector::GeomStreamPieceSelector
(BitfieldMan* bitfieldMan,
double base)
: bitfieldMan_(bitfieldMan),
base_(base)
base_(base),
offsetIndex_(0)
{}
GeomStreamPieceSelector::~GeomStreamPieceSelector() {}
@ -53,7 +54,16 @@ bool GeomStreamPieceSelector::select
size_t length)
{
return bitfieldMan_->getGeomMissingUnusedIndex
(index, minSplitSize, ignoreBitfield, length, base_, 0);
(index, minSplitSize, ignoreBitfield, length, base_, offsetIndex_);
}
void GeomStreamPieceSelector::onBitfieldInit()
{
size_t index;
bool r = bitfieldMan_->getFirstMissingIndex(index);
if(r) {
offsetIndex_ = index;
}
}
} // namespace aria2

View File

@ -51,9 +51,12 @@ public:
size_t minSplitSize,
const unsigned char* ignoreBitfield,
size_t length);
virtual void onBitfieldInit();
private:
BitfieldMan* bitfieldMan_;
double base_;
size_t offsetIndex_;
};
} // namespace aria2

View File

@ -54,4 +54,6 @@ bool InorderStreamPieceSelector::select
(index, minSplitSize, ignoreBitfield, length);
}
void InorderStreamPieceSelector::onBitfieldInit() {}
} // namespace aria2

View File

@ -51,6 +51,8 @@ public:
size_t minSplitSize,
const unsigned char* ignoreBitfield,
size_t length);
virtual void onBitfieldInit();
private:
BitfieldMan* bitfieldMan_;
};

View File

@ -283,6 +283,9 @@ public:
// are not used and not completed. If all pieces after index+1 are
// used or completed, returns the number of pieces.
virtual size_t getNextUsedIndex(size_t index) = 0;
// Called when system detects download is not finished
virtual void onDownloadIncomplete() = 0;
};
typedef SharedHandle<PieceStorage> PieceStorageHandle;

View File

@ -38,6 +38,7 @@
#include "StreamFileAllocationEntry.h"
#include "prefs.h"
#include "Option.h"
#include "PieceStorage.h"
namespace aria2 {
@ -51,6 +52,8 @@ StreamCheckIntegrityEntry::~StreamCheckIntegrityEntry() {}
void StreamCheckIntegrityEntry::onDownloadIncomplete
(std::vector<Command*>& commands, DownloadEngine* e)
{
const SharedHandle<PieceStorage>& ps = getRequestGroup()->getPieceStorage();
ps->onDownloadIncomplete();
if(getRequestGroup()->getOption()->getAsBool(PREF_HASH_CHECK_ONLY)) {
return;
}

View File

@ -60,6 +60,10 @@ public:
size_t minSplitSize,
const unsigned char* ignoreBitfield,
size_t length) = 0;
// Called when initial bitfield was fixed. Optimize
// StreamPieceSelector to take advantages of the initial bitfield.
virtual void onBitfieldInit() = 0;
};
} // namespace aria2

View File

@ -292,6 +292,8 @@ public:
virtual size_t getNextUsedIndex(size_t index) { return 0; }
void setDiskWriterFactory(const SharedHandle<DiskWriterFactory>& diskWriterFactory);
virtual void onDownloadIncomplete() {}
};
typedef SharedHandle<UnknownLengthPieceStorage> UnknownLengthPieceStorageHandle;

View File

@ -0,0 +1,50 @@
#include "GeomStreamPieceSelector.h"
#include <cstring>
#include <cppunit/extensions/HelperMacros.h>
#include "Exception.h"
#include "util.h"
#include "BitfieldMan.h"
namespace aria2 {
class GeomStreamPieceSelectorTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(GeomStreamPieceSelectorTest);
CPPUNIT_TEST(testOnBitfieldInit);
CPPUNIT_TEST_SUITE_END();
public:
void testOnBitfieldInit();
};
CPPUNIT_TEST_SUITE_REGISTRATION(GeomStreamPieceSelectorTest);
void GeomStreamPieceSelectorTest::testOnBitfieldInit()
{
BitfieldMan bf(1024, 1024*20);
bf.setBitRange(0, 10);
GeomStreamPieceSelector sel(&bf, 2);
sel.onBitfieldInit();
unsigned char igbf[3];
memset(igbf, 0, 3);
size_t index;
// 11111|11111|00000|00000
CPPUNIT_ASSERT(sel.select(index, 1024*20, igbf, sizeof(igbf)));
CPPUNIT_ASSERT_EQUAL((size_t)11, index);
bf.setUseBit(11);
// 11111|11111|10000|00000
CPPUNIT_ASSERT(sel.select(index, 1024*20, igbf, sizeof(igbf)));
CPPUNIT_ASSERT_EQUAL((size_t)12, index);
bf.setUseBit(12);
// 11111|11111|11000|00000
CPPUNIT_ASSERT(sel.select(index, 1024*20, igbf, sizeof(igbf)));
CPPUNIT_ASSERT_EQUAL((size_t)13, index);
bf.setUseBit(13);
// 11111|11111|11100|00000
CPPUNIT_ASSERT(sel.select(index, 1024*20, igbf, sizeof(igbf)));
CPPUNIT_ASSERT_EQUAL((size_t)15, index);
}
} // namespace aria2

View File

@ -80,7 +80,8 @@ aria2c_SOURCES = AllTest.cc\
JsonTest.cc\
RpcResponseTest.cc\
RpcMethodTest.cc\
BufferedFileTest.cc
BufferedFileTest.cc\
GeomStreamPieceSelectorTest.cc
if ENABLE_XML_RPC
aria2c_SOURCES += XmlRpcRequestParserControllerTest.cc\

View File

@ -280,6 +280,8 @@ public:
{
return 0;
}
virtual void onDownloadIncomplete() {}
};
} // namespace aria2