summaryrefslogtreecommitdiff
path: root/src/MultiFileAllocationIterator.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2015-03-22 01:32:38 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2015-03-22 01:32:38 +0900
commit7f9bb0e2da6365863f7c144117e5dbfa5f9aa3cf (patch)
treed404ed59d1b640d5340c743229259ca439ca3074 /src/MultiFileAllocationIterator.cc
parentc248d456d194532098747055dd75a28118d77521 (diff)
Use dedicated DiskWriter in MultiDiskFileAllocationIterator
We have to use dedicated DiskWriter instead of (*entryItr_)->getDiskWriter(). This is because SingleFileAllocationIterator cannot reopen file if file is closed by OpenedFileCounter.
Diffstat (limited to 'src/MultiFileAllocationIterator.cc')
-rw-r--r--src/MultiFileAllocationIterator.cc31
1 files changed, 26 insertions, 5 deletions
diff --git a/src/MultiFileAllocationIterator.cc b/src/MultiFileAllocationIterator.cc
index 1b234c0a..225d8a00 100644
--- a/src/MultiFileAllocationIterator.cc
+++ b/src/MultiFileAllocationIterator.cc
@@ -41,6 +41,7 @@
# include "FallocFileAllocationIterator.h"
#endif // HAVE_SOME_FALLOCATE
#include "DiskWriter.h"
+#include "DefaultDiskWriterFactory.h"
namespace aria2 {
@@ -50,37 +51,57 @@ MultiFileAllocationIterator::MultiFileAllocationIterator
entryItr_{std::begin(diskAdaptor_->getDiskWriterEntries())}
{}
-MultiFileAllocationIterator::~MultiFileAllocationIterator() {}
+MultiFileAllocationIterator::~MultiFileAllocationIterator() {
+ if(diskWriter_) {
+ diskWriter_->closeFile();
+ }
+}
void MultiFileAllocationIterator::allocateChunk()
{
while((!fileAllocationIterator_ ||
fileAllocationIterator_->finished()) &&
entryItr_ != std::end(diskAdaptor_->getDiskWriterEntries())) {
+ if (diskWriter_) {
+ diskWriter_->closeFile();
+ diskWriter_.reset();
+ }
+ fileAllocationIterator_.reset();
+ if(!(*entryItr_)->getDiskWriter()) {
+ ++entryItr_;
+ continue;
+ }
auto& fileEntry = (*entryItr_)->getFileEntry();
+ // we use dedicated DiskWriter instead of
+ // (*entryItr_)->getDiskWriter(). This is because
+ // SingleFileAllocationIterator cannot reopen file if file is
+ // closed by OpenedFileCounter.
+ diskWriter_ =
+ DefaultDiskWriterFactory().newDiskWriter((*entryItr_)->getFilePath());
// Open file before calling DiskWriterEntry::size(). Calling
// private function of MultiDiskAdaptor.
- diskAdaptor_->openIfNot((*entryItr_).get(), &DiskWriterEntry::openFile);
+ diskWriter_->openFile(fileEntry->getLength());
+
if((*entryItr_)->needsFileAllocation() &&
(*entryItr_)->size() < fileEntry->getLength()) {
switch(diskAdaptor_->getFileAllocationMethod()) {
#ifdef HAVE_SOME_FALLOCATE
case(DiskAdaptor::FILE_ALLOC_FALLOC):
fileAllocationIterator_ = make_unique<FallocFileAllocationIterator>
- ((*entryItr_)->getDiskWriter().get(),
+ (diskWriter_.get(),
(*entryItr_)->size(),
fileEntry->getLength());
break;
#endif // HAVE_SOME_FALLOCATE
case(DiskAdaptor::FILE_ALLOC_TRUNC):
fileAllocationIterator_ = make_unique<TruncFileAllocationIterator>
- ((*entryItr_)->getDiskWriter().get(),
+ (diskWriter_.get(),
(*entryItr_)->size(),
fileEntry->getLength());
break;
default:
fileAllocationIterator_ = make_unique<AdaptiveFileAllocationIterator>
- ((*entryItr_)->getDiskWriter().get(),
+ (diskWriter_.get(),
(*entryItr_)->size(),
fileEntry->getLength());
break;