/* */ #include "OpenedFileCounter.h" #include #include "RequestGroupMan.h" #include "RequestGroup.h" #include "PieceStorage.h" #include "DiskAdaptor.h" #include "SimpleRandomizer.h" namespace aria2 { OpenedFileCounter::OpenedFileCounter(RequestGroupMan* rgman, size_t maxOpenFiles) : rgman_(rgman), maxOpenFiles_(maxOpenFiles), numOpenFiles_(0) { } void OpenedFileCounter::ensureMaxOpenFileLimit(size_t numNewFiles) { if (!rgman_) { return; } if (numOpenFiles_ + numNewFiles <= maxOpenFiles_) { numOpenFiles_ += numNewFiles; return; } assert(numNewFiles <= maxOpenFiles_); size_t numClose = numOpenFiles_ + numNewFiles - maxOpenFiles_; size_t left = numClose; auto& requestGroups = rgman_->getRequestGroups(); auto mark = std::begin(requestGroups); std::advance( mark, SimpleRandomizer::getInstance()->getRandomNumber(requestGroups.size())); auto closeFun = [&left](const std::shared_ptr& group) { auto& ps = group->getPieceStorage(); if (!ps) { return; } auto diskAdaptor = ps->getDiskAdaptor(); if (!diskAdaptor) { return; } left -= diskAdaptor->tryCloseFile(left); }; for (auto i = mark; i != std::end(requestGroups) && left > 0; ++i) { closeFun(*i); } for (auto i = std::begin(requestGroups); i != mark && left > 0; ++i) { closeFun(*i); } assert(left == 0); numOpenFiles_ += numNewFiles - numClose; } void OpenedFileCounter::reduceNumOfOpenedFile(size_t numCloseFiles) { if (!rgman_) { return; } assert(numOpenFiles_ >= numCloseFiles); numOpenFiles_ -= numCloseFiles; } void OpenedFileCounter::deactivate() { rgman_ = nullptr; } } // namespace aria2