diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2007-11-21 16:14:40 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2007-11-21 16:14:40 +0000 |
| commit | c9e3d510547de63658c397060095d51b2c1b2c4b (patch) | |
| tree | 17c05e8798c9dfaee1a322146a5ccbf2c8f067e6 /src/MultiFileAllocationIterator.cc | |
| parent | 59fb4066fb178163a34bb1e0b53fff59e1c187f2 (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.cc | 54 |
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; +} |
