summaryrefslogtreecommitdiff
path: root/src/MultiFileAllocationIterator.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2016-03-26 17:12:52 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2016-03-26 17:20:27 +0900
commitd64089632e82a2548752c7a6baaa68365a795a74 (patch)
tree57fc7b85a8c1290975d58fa4761b04a7695bf7e3 /src/MultiFileAllocationIterator.cc
parentc81b1321122e8509b55c94c0cbca0d8d6d319f0c (diff)
parenta7cd943a06b1a5ff4515b57060b84037f8d01f9f (diff)
Merge branch 'master' into random-webseeding
Diffstat (limited to 'src/MultiFileAllocationIterator.cc')
-rw-r--r--src/MultiFileAllocationIterator.cc90
1 files changed, 51 insertions, 39 deletions
diff --git a/src/MultiFileAllocationIterator.cc b/src/MultiFileAllocationIterator.cc
index 225d8a00..6ed22444 100644
--- a/src/MultiFileAllocationIterator.cc
+++ b/src/MultiFileAllocationIterator.cc
@@ -38,39 +38,50 @@
#include "AdaptiveFileAllocationIterator.h"
#include "TruncFileAllocationIterator.h"
#ifdef HAVE_SOME_FALLOCATE
-# include "FallocFileAllocationIterator.h"
+#include "FallocFileAllocationIterator.h"
#endif // HAVE_SOME_FALLOCATE
#include "DiskWriter.h"
#include "DefaultDiskWriterFactory.h"
+#include "LogFactory.h"
namespace aria2 {
-MultiFileAllocationIterator::MultiFileAllocationIterator
-(MultiDiskAdaptor* diskAdaptor)
- : diskAdaptor_{diskAdaptor},
- entryItr_{std::begin(diskAdaptor_->getDiskWriterEntries())}
-{}
+MultiFileAllocationIterator::MultiFileAllocationIterator(
+ MultiDiskAdaptor* diskAdaptor)
+ : diskAdaptor_{diskAdaptor},
+ entryItr_{std::begin(diskAdaptor_->getDiskWriterEntries())}
+{
+}
-MultiFileAllocationIterator::~MultiFileAllocationIterator() {
- if(diskWriter_) {
+MultiFileAllocationIterator::~MultiFileAllocationIterator()
+{
+ if (diskWriter_) {
diskWriter_->closeFile();
}
}
void MultiFileAllocationIterator::allocateChunk()
{
- while((!fileAllocationIterator_ ||
- fileAllocationIterator_->finished()) &&
- entryItr_ != std::end(diskAdaptor_->getDiskWriterEntries())) {
+ if (fileAllocationIterator_) {
+ if (!fileAllocationIterator_->finished()) {
+ fileAllocationIterator_->allocateChunk();
+ return;
+ }
+
if (diskWriter_) {
diskWriter_->closeFile();
diskWriter_.reset();
}
fileAllocationIterator_.reset();
- if(!(*entryItr_)->getDiskWriter()) {
+ ++entryItr_;
+ }
+
+ while (entryItr_ != std::end(diskAdaptor_->getDiskWriterEntries())) {
+ if (!(*entryItr_)->getDiskWriter()) {
++entryItr_;
continue;
}
+
auto& fileEntry = (*entryItr_)->getFileEntry();
// we use dedicated DiskWriter instead of
// (*entryItr_)->getDiskWriter(). This is because
@@ -82,60 +93,61 @@ void MultiFileAllocationIterator::allocateChunk()
// private function of MultiDiskAdaptor.
diskWriter_->openFile(fileEntry->getLength());
- if((*entryItr_)->needsFileAllocation() &&
- (*entryItr_)->size() < fileEntry->getLength()) {
- switch(diskAdaptor_->getFileAllocationMethod()) {
+ if ((*entryItr_)->needsFileAllocation() &&
+ (*entryItr_)->size() < fileEntry->getLength()) {
+ A2_LOG_INFO(fmt("Allocating file %s: target size=%" PRId64
+ ", current size=%" PRId64,
+ (*entryItr_)->getFilePath().c_str(),
+ fileEntry->getLength(), (*entryItr_)->size()));
+ switch (diskAdaptor_->getFileAllocationMethod()) {
#ifdef HAVE_SOME_FALLOCATE
- case(DiskAdaptor::FILE_ALLOC_FALLOC):
- fileAllocationIterator_ = make_unique<FallocFileAllocationIterator>
- (diskWriter_.get(),
- (*entryItr_)->size(),
- fileEntry->getLength());
+ case (DiskAdaptor::FILE_ALLOC_FALLOC):
+ fileAllocationIterator_ = make_unique<FallocFileAllocationIterator>(
+ diskWriter_.get(), (*entryItr_)->size(), fileEntry->getLength());
break;
#endif // HAVE_SOME_FALLOCATE
- case(DiskAdaptor::FILE_ALLOC_TRUNC):
- fileAllocationIterator_ = make_unique<TruncFileAllocationIterator>
- (diskWriter_.get(),
- (*entryItr_)->size(),
- fileEntry->getLength());
+ case (DiskAdaptor::FILE_ALLOC_TRUNC):
+ fileAllocationIterator_ = make_unique<TruncFileAllocationIterator>(
+ diskWriter_.get(), (*entryItr_)->size(), fileEntry->getLength());
break;
default:
- fileAllocationIterator_ = make_unique<AdaptiveFileAllocationIterator>
- (diskWriter_.get(),
- (*entryItr_)->size(),
- fileEntry->getLength());
+ fileAllocationIterator_ = make_unique<AdaptiveFileAllocationIterator>(
+ diskWriter_.get(), (*entryItr_)->size(), fileEntry->getLength());
break;
}
- break;
+ fileAllocationIterator_->allocateChunk();
+ return;
}
+
+ diskWriter_->closeFile();
+ diskWriter_.reset();
+
++entryItr_;
}
- if(finished()) {
- return;
- }
- fileAllocationIterator_->allocateChunk();
}
bool MultiFileAllocationIterator::finished()
{
return entryItr_ == std::end(diskAdaptor_->getDiskWriterEntries()) &&
- (!fileAllocationIterator_ || fileAllocationIterator_->finished());
+ (!fileAllocationIterator_ || fileAllocationIterator_->finished());
}
int64_t MultiFileAllocationIterator::getCurrentLength()
{
- if(!fileAllocationIterator_) {
+ if (!fileAllocationIterator_) {
return 0;
- } else {
+ }
+ else {
return fileAllocationIterator_->getCurrentLength();
}
}
int64_t MultiFileAllocationIterator::getTotalLength()
{
- if(!fileAllocationIterator_) {
+ if (!fileAllocationIterator_) {
return 0;
- } else {
+ }
+ else {
return fileAllocationIterator_->getTotalLength();
}
}