diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/MultiDiskAdaptor.cc | 99 | ||||
| -rw-r--r-- | src/MultiFileAllocationIterator.cc | 43 | ||||
| -rw-r--r-- | src/MultiFileAllocationIterator.h | 4 |
3 files changed, 79 insertions, 67 deletions
diff --git a/src/MultiDiskAdaptor.cc b/src/MultiDiskAdaptor.cc index dc59830a..a9ad762f 100644 --- a/src/MultiDiskAdaptor.cc +++ b/src/MultiDiskAdaptor.cc @@ -149,20 +149,77 @@ MultiDiskAdaptor::MultiDiskAdaptor(): MultiDiskAdaptor::~MultiDiskAdaptor() {} +static SharedHandle<DiskWriterEntry> createDiskWriterEntry +(const SharedHandle<FileEntry>& fileEntry, + DiskWriterFactory& dwFactory, + bool directIOAllowed) +{ + SharedHandle<DiskWriterEntry> entry(new DiskWriterEntry(fileEntry)); + entry->setDiskWriter(dwFactory.newDiskWriter()); + entry->getDiskWriter()->setDirectIOAllowed(directIOAllowed); + + return entry; +} + + void MultiDiskAdaptor::resetDiskWriterEntries() { diskWriterEntries.clear(); - for(FileEntries::const_iterator itr = fileEntries.begin(); - itr != fileEntries.end(); itr++) { - DiskWriterEntryHandle entry(new DiskWriterEntry(*itr)); - if((*itr)->isRequested()) { - entry->setDiskWriter(DefaultDiskWriterFactory().newDiskWriter()); - } else { - SharedHandle<DiskWriter> dw(new DefaultDiskWriter()); - entry->setDiskWriter(dw); + + if(fileEntries.empty()) { + return; + } + + DefaultDiskWriterFactory dwFactory; + if(pieceLength == 0) { + for(std::deque<SharedHandle<FileEntry> >::const_iterator itr = + fileEntries.begin(); itr != fileEntries.end(); ++itr) { + if((*itr)->isRequested()) { + diskWriterEntries.push_back + (createDiskWriterEntry(*itr, dwFactory, _directIOAllowed)); + } + } + } else { + std::deque<SharedHandle<FileEntry> >::const_iterator done = fileEntries.begin(); + for(std::deque<SharedHandle<FileEntry> >::const_iterator itr = + fileEntries.begin(); itr != fileEntries.end();) { + if(!(*itr)->isRequested()) { + ++itr; + continue; + } + off_t pieceStartOffset = ((*itr)->getOffset()/pieceLength)*pieceLength; + std::deque<SharedHandle<DiskWriterEntry> >::iterator insertionPoint = + diskWriterEntries.end(); + + if(itr != fileEntries.begin()) { + for(std::deque<SharedHandle<FileEntry> >::const_iterator i = itr-1; + i != done; --i) { + if((uint64_t)pieceStartOffset < (*i)->getOffset()+(*i)->getLength()) { + insertionPoint = diskWriterEntries.insert + (insertionPoint, + createDiskWriterEntry(*i, dwFactory, _directIOAllowed)); + } else { + break; + } + } + } + + diskWriterEntries.push_back + (createDiskWriterEntry(*itr, dwFactory, _directIOAllowed)); + + ++itr; + + for(; itr != fileEntries.end(); ++itr) { + if((*itr)->getOffset() < pieceStartOffset+pieceLength) { + diskWriterEntries.push_back + (createDiskWriterEntry(*itr, dwFactory, _directIOAllowed)); + } else { + break; + } + } + + done = itr-1; } - entry->getDiskWriter()->setDirectIOAllowed(_directIOAllowed); - diskWriterEntries.push_back(entry); } } @@ -173,9 +230,9 @@ std::string MultiDiskAdaptor::getTopDirPath() const void MultiDiskAdaptor::mkdir(const std::string& topDirPath) const { - for(FileEntries::const_iterator itr = fileEntries.begin(); - itr != fileEntries.end(); itr++) { - (*itr)->setupDir(topDirPath); + for(std::deque<SharedHandle<DiskWriterEntry> >::const_iterator i = + diskWriterEntries.begin(); i != diskWriterEntries.end(); ++i) { + (*i)->getFileEntry()->setupDir(topDirPath); } } @@ -211,16 +268,16 @@ void MultiDiskAdaptor::openIfNot void MultiDiskAdaptor::openFile() { _cachedTopDirPath = getTopDirPath(); - mkdir(_cachedTopDirPath); resetDiskWriterEntries(); + mkdir(_cachedTopDirPath); // TODO we should call openIfNot here? } void MultiDiskAdaptor::initAndOpenFile() { _cachedTopDirPath = getTopDirPath(); - mkdir(_cachedTopDirPath); resetDiskWriterEntries(); + mkdir(_cachedTopDirPath); // Call DiskWriterEntry::initAndOpenFile to make files truncated. for(DiskWriterEntries::iterator itr = diskWriterEntries.begin(); itr != diskWriterEntries.end(); ++itr) { @@ -339,17 +396,15 @@ ssize_t MultiDiskAdaptor::readData(unsigned char* data, size_t len, off_t offset bool MultiDiskAdaptor::fileExists() { - if(diskWriterEntries.empty()) { - resetDiskWriterEntries(); - } // Don't use _cachedTopDirPath because they are initialized after opening files. // This method could be called before opening files. std::string topDirPath = getTopDirPath(); - for(DiskWriterEntries::iterator itr = diskWriterEntries.begin(); - itr != diskWriterEntries.end(); ++itr) { - if((*itr)->fileExists(topDirPath)) { + for(std::deque<SharedHandle<FileEntry> >::iterator i = + fileEntries.begin(); i != fileEntries.end(); ++i) { + + if(File(topDirPath+"/"+(*i)->getPath()).isFile()) { return true; - } + } } return false; } diff --git a/src/MultiFileAllocationIterator.cc b/src/MultiFileAllocationIterator.cc index 349d174f..1f541361 100644 --- a/src/MultiFileAllocationIterator.cc +++ b/src/MultiFileAllocationIterator.cc @@ -42,11 +42,9 @@ namespace aria2 { MultiFileAllocationIterator::MultiFileAllocationIterator(MultiDiskAdaptor* diskAdaptor): _diskAdaptor(diskAdaptor), + _entries(_diskAdaptor->diskWriterEntries), _offset(0) -{ - makeDiskWriterEntries(_entries, diskAdaptor->diskWriterEntries, - diskAdaptor->getPieceLength()); -} +{} MultiFileAllocationIterator::~MultiFileAllocationIterator() {} @@ -106,41 +104,4 @@ const DiskWriterEntries& MultiFileAllocationIterator::getDiskWriterEntries() con return _entries; } -void MultiFileAllocationIterator::makeDiskWriterEntries -(std::deque<SharedHandle<DiskWriterEntry> >& dwEntries, - const DiskWriterEntries& srcEntries, size_t pieceLength) const -{ - if(pieceLength == 0) { - for(DiskWriterEntries::const_iterator itr = srcEntries.begin(); itr != srcEntries.end(); ++itr) { - if((*itr)->getFileEntry()->isRequested()) { - dwEntries.push_back(*itr); - } - } - } else { - DiskWriterEntries temp(srcEntries); - { - SharedHandle<FileEntry> f(new FileEntry()); - SharedHandle<DiskWriterEntry> e(new DiskWriterEntry(f)); - temp.push_front(e); - } - DiskWriterEntries::const_iterator done = temp.begin(); - for(DiskWriterEntries::const_iterator itr = temp.begin()+1; itr != temp.end(); ++itr) { - const FileEntryHandle& fileEntry = (*itr)->getFileEntry(); - if(!fileEntry->isRequested()) { - continue; - } - off_t pieceStartOffset = (fileEntry->getOffset()/pieceLength)*pieceLength; - for(DiskWriterEntries::const_iterator i = itr-1; i != done; --i) { - if((uint64_t)pieceStartOffset < (*i)->getFileEntry()->getOffset()+(*i)->getFileEntry()->getLength()) { - dwEntries.push_back(*i); - } else { - break; - } - } - dwEntries.push_back(*itr); - done = itr; - } - } -} - } // namespace aria2 diff --git a/src/MultiFileAllocationIterator.h b/src/MultiFileAllocationIterator.h index 366eff16..1f32ff04 100644 --- a/src/MultiFileAllocationIterator.h +++ b/src/MultiFileAllocationIterator.h @@ -52,10 +52,6 @@ private: SharedHandle<SingleFileAllocationIterator> _fileAllocationIterator; off_t _offset; - void makeDiskWriterEntries - (std::deque<SharedHandle<DiskWriterEntry> >& dwEntries, - const std::deque<SharedHandle<DiskWriterEntry> >& srcEntries, - size_t pieceLength) const; public: MultiFileAllocationIterator(MultiDiskAdaptor* diskAdaptor); |
