summaryrefslogtreecommitdiff
path: root/src/MultiFileAllocationIterator.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2007-11-21 16:14:40 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2007-11-21 16:14:40 +0000
commitc9e3d510547de63658c397060095d51b2c1b2c4b (patch)
tree17c05e8798c9dfaee1a322146a5ccbf2c8f067e6 /src/MultiFileAllocationIterator.cc
parent59fb4066fb178163a34bb1e0b53fff59e1c187f2 (diff)
2007-11-20 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Preallocate non-requested file which is adjacent forward to requested file('requested' files means the files given in --select-file option) if they share a same piece. This fixes long pause in the file system which doesn't support sparse files like FAT32 while downloading. * src/MultiFileAllocationIterator.{h, cc} * test/MultiFileAllocationIteratorTest.cc * src/FileEntry.{h, cc} Removed unused _option. * src/MultiDiskAdaptor.h * test/MultiDiskAdaptorTest.cc * src/DefaultPieceStorage.cc Set the default value of --seed-ratio to 1.0. If 0.0 is given, then seeding continues regardless of share ratio. * src/version_usage.cc * src/option_processing.cc * src/BtSetup.cc * doc/aria2c.1.txt * doc/aria2c.1 Fixed: Selective download is not working in BitTorrent * src/RequestGroup.cc Introduced Sequence class. Use this instead of Util::unfoldRange() * src/PieceStorage.h * test/MockPieceStorage.h * src/UnknownLengthPieceStorage.h * src/DefaultPieceStorage.{h, cc} * src/Metalink2RequestGroup.cc * src/RequestGroup.cc * src/Sequence.h * test/SequenceTest.cc * src/IntSequence.h * src/message.h * src/Util.{h, cc} * test/UtilTest.cc Added new function 'parse' to catch exception thrown by subclass's parseArg * src/OptionHandler.h * src/OptionParser.cc * src/NameMatchOptionHandler.h * src/OptionHandlerImpl.h * test/OptionHandlerTest.cc Added IntegerRangeOptionHandler. Used for --listen-port and --select-file. Now --listen-port accepts range of port. * src/OptionHandlerFactory.cc * src/version_usage.cc * src/OptionHandlerImpl.h * src/option_processing.cc * src/BtSetup.cc * src/PeerListenCommand.{h, cc} * doc/aria2c.1.txt * doc/aria2c.1 Implemented operator< for Exception class to provide easy way to print exception stack trace. * src/Exception.{h, cc} * src/main.cc * src/option_processing.cc
Diffstat (limited to 'src/MultiFileAllocationIterator.cc')
-rw-r--r--src/MultiFileAllocationIterator.cc54
1 files changed, 45 insertions, 9 deletions
diff --git a/src/MultiFileAllocationIterator.cc b/src/MultiFileAllocationIterator.cc
index fb2f7fe4..7d8cdfcb 100644
--- a/src/MultiFileAllocationIterator.cc
+++ b/src/MultiFileAllocationIterator.cc
@@ -40,7 +40,7 @@
MultiFileAllocationIterator::MultiFileAllocationIterator(MultiDiskAdaptor* diskAdaptor):
_diskAdaptor(diskAdaptor),
- _entries(diskAdaptor->getFileEntries()),
+ _entries(makeFileEntries(diskAdaptor->getFileEntries(), diskAdaptor->getPieceLength())),
_currentEntry(0),
_offset(0)
{}
@@ -51,16 +51,14 @@ void MultiFileAllocationIterator::prepareNextEntry()
{
_currentEntry = 0;
_offset = 0;
- while(!_entries.empty()) {
+ if(!_entries.empty()) {
FileEntryHandle entry = _entries.front();
_entries.pop_front();
- if(entry->isRequested()) {
- _currentEntry = entry;
- _offset = File(_diskAdaptor->getStoreDir()+"/"+
- _diskAdaptor->getTopDir()+"/"+
- _currentEntry->getPath()).size();
- break;
- }
+
+ _currentEntry = entry;
+ _offset = File(_diskAdaptor->getStoreDir()+"/"+
+ _diskAdaptor->getTopDir()+"/"+
+ _currentEntry->getPath()).size();
}
}
@@ -99,3 +97,41 @@ int64_t MultiFileAllocationIterator::getTotalLength()
return _currentEntry->getLength();
}
}
+
+const FileEntries& MultiFileAllocationIterator::getFileEntries() const
+{
+ return _entries;
+}
+
+FileEntries MultiFileAllocationIterator::makeFileEntries(const FileEntries& srcEntries, int32_t pieceLength) const
+{
+ if(pieceLength == 0) {
+ FileEntries entries;
+ for(FileEntries::const_iterator itr = srcEntries.begin(); itr != srcEntries.end(); ++itr) {
+ if((*itr)->isRequested()) {
+ entries.push_back(*itr);
+ }
+ }
+ return entries;
+ }
+ FileEntries temp(srcEntries);
+ temp.push_front(new FileEntry());
+ FileEntries entries;
+ FileEntries::const_iterator done = temp.begin();
+ for(FileEntries::const_iterator itr = temp.begin()+1; itr != temp.end(); ++itr) {
+ if(!(*itr)->isRequested()) {
+ continue;
+ }
+ int64_t pieceStartOffset = ((*itr)->getOffset()/pieceLength)*pieceLength;
+ for(FileEntries::const_iterator i = itr-1; i != done; --i) {
+ if(pieceStartOffset < (*i)->getOffset()+(*i)->getLength()) {
+ entries.push_back(*i);
+ } else {
+ break;
+ }
+ }
+ entries.push_back(*itr);
+ done = itr;
+ }
+ return entries;
+}