summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/MultiDiskAdaptor.cc99
-rw-r--r--src/MultiFileAllocationIterator.cc43
-rw-r--r--src/MultiFileAllocationIterator.h4
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);