diff --git a/doc/manual-src/en/aria2c.rst b/doc/manual-src/en/aria2c.rst index d3cc295b..0e9705c5 100644 --- a/doc/manual-src/en/aria2c.rst +++ b/doc/manual-src/en/aria2c.rst @@ -1375,6 +1375,16 @@ Advanced Options downloads. Specifying 0 means no download result is kept. Default: ``1000`` +.. option:: --max-mmap-limit= + + Set the maximum file size to enable mmap (see + :option:`--enable-mmap` option). The file size is determined by the + sum of all files contained in one download. For example, if a + download contains 5 files, then file size is the total size of those + files. If file size is strictly greater than the size specified in + this option, mmap will be disabled. + Default: ``9223372036854775807`` + .. option:: --max-resume-failure-tries= When used with :option:`--always-resume=false, <--always-resume>` aria2 downloads file from @@ -2040,6 +2050,7 @@ of URIs. These optional lines must start with white space(s). * :option:`max-connection-per-server <-x>` * :option:`max-download-limit <--max-download-limit>` * :option:`max-file-not-found <--max-file-not-found>` + * :option:`max-mmap-limit <--max-mmap-limit>` * :option:`max-resume-failure-tries <--max-resume-failure-tries>` * :option:`max-tries <-m>` * :option:`max-upload-limit <-u>` diff --git a/src/BtFileAllocationEntry.cc b/src/BtFileAllocationEntry.cc index ed44e44e..dc9cc04f 100644 --- a/src/BtFileAllocationEntry.cc +++ b/src/BtFileAllocationEntry.cc @@ -64,7 +64,9 @@ void BtFileAllocationEntry::prepareForNextAction( BtSetup().setup(commands, getRequestGroup(), e, option.get()); if (option->getAsBool(PREF_ENABLE_MMAP) && - option->get(PREF_FILE_ALLOCATION) != V_NONE) { + option->get(PREF_FILE_ALLOCATION) != V_NONE && + getRequestGroup()->getPieceStorage()->getDiskAdaptor()->size() <= + option->getAsLLInt(PREF_MAX_MMAP_LIMIT)) { getRequestGroup()->getPieceStorage()->getDiskAdaptor()->enableMmap(); } if (!getRequestGroup()->downloadFinished()) { diff --git a/src/OptionHandlerFactory.cc b/src/OptionHandlerFactory.cc index ef6a8268..87b07cec 100644 --- a/src/OptionHandlerFactory.cc +++ b/src/OptionHandlerFactory.cc @@ -447,6 +447,16 @@ std::vector OptionHandlerFactory::createOptionHandlers() op->setChangeGlobalOption(true); handlers.push_back(op); } + { + OptionHandler* op(new UnitNumberOptionHandler( + PREF_MAX_MMAP_LIMIT, TEXT_MAX_MMAP_LIMIT, + util::itos(std::numeric_limits::max()), 0)); + op->addTag(TAG_ADVANCED); + op->setInitialOption(true); + op->setChangeGlobalOption(true); + op->setChangeOptionForReserved(true); + handlers.push_back(op); + } { OptionHandler* op( new UnitNumberOptionHandler(PREF_MAX_OVERALL_DOWNLOAD_LIMIT, diff --git a/src/StreamFileAllocationEntry.cc b/src/StreamFileAllocationEntry.cc index c6d1de2a..e02bbc48 100644 --- a/src/StreamFileAllocationEntry.cc +++ b/src/StreamFileAllocationEntry.cc @@ -66,7 +66,9 @@ void StreamFileAllocationEntry::prepareForNextAction( // RequestGroup::createInitialCommand() getRequestGroup()->getDownloadContext()->resetDownloadStartTime(); if (option->getAsBool(PREF_ENABLE_MMAP) && - option->get(PREF_FILE_ALLOCATION) != V_NONE) { + option->get(PREF_FILE_ALLOCATION) != V_NONE && + getRequestGroup()->getPieceStorage()->getDiskAdaptor()->size() <= + option->getAsLLInt(PREF_MAX_MMAP_LIMIT)) { getRequestGroup()->getPieceStorage()->getDiskAdaptor()->enableMmap(); } if (getNextCommand()) { diff --git a/src/prefs.cc b/src/prefs.cc index 15371f96..caffd349 100644 --- a/src/prefs.cc +++ b/src/prefs.cc @@ -357,6 +357,8 @@ PrefPtr PREF_RLIMIT_NOFILE = makePref("rlimit-nofile"); PrefPtr PREF_MIN_TLS_VERSION = makePref("min-tls-version"); // value: 1*digit PrefPtr PREF_SOCKET_RECV_BUFFER_SIZE = makePref("socket-recv-buffer-size"); +// value: 1*digit +PrefPtr PREF_MAX_MMAP_LIMIT = makePref("max-mmap-limit"); /** * FTP related preferences diff --git a/src/prefs.h b/src/prefs.h index f8115f52..52078fe9 100644 --- a/src/prefs.h +++ b/src/prefs.h @@ -314,6 +314,8 @@ extern PrefPtr PREF_RLIMIT_NOFILE; extern PrefPtr PREF_MIN_TLS_VERSION; // value: 1*digit extern PrefPtr PREF_SOCKET_RECV_BUFFER_SIZE; +// value: 1*digit +extern PrefPtr PREF_MAX_MMAP_LIMIT; /** * FTP related preferences diff --git a/src/usage_text.h b/src/usage_text.h index 09552249..5f11fde4 100644 --- a/src/usage_text.h +++ b/src/usage_text.h @@ -1057,5 +1057,14 @@ " the command given by --on-bt-download-complete\n" \ " is executed. To disable this action, give false\n" \ " to this option.") +#define TEXT_MAX_MMAP_LIMIT \ + _(" --max-mmap-limit=SIZE Set the maximum file size to enable mmap (see\n" \ + " --enable-mmap option). The file size is\n" \ + " determined by the sum of all files contained in\n" \ + " one download. For example, if a download\n" \ + " contains 5 files, then file size is the total\n" \ + " size of those files. If file size is strictly\n" \ + " greater than the size specified in this option,\n" \ + " mmap will be disabled.") // clang-format on