mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2025-12-22 00:17:23 -06:00
Allow to use POSIX-compliant disk IO type
This patch allows user to switch disk IO type between memory mapped files based type (default in libtorrent 2, and seems causing memory issues) and POSIX-compliant type which is more conservative on memory usage. Co-authored-by: Chocobo1 <Chocobo1@users.noreply.github.com> Co-authored-by: Vladimir Golovnev (Glassez) <glassez@yandex.ru> PR #16895.
This commit is contained in:
@@ -34,6 +34,8 @@
|
||||
#include "common.h"
|
||||
|
||||
#ifdef QBT_USES_LIBTORRENT2
|
||||
#include <libtorrent/mmap_disk_io.hpp>
|
||||
#include <libtorrent/posix_disk_io.hpp>
|
||||
#include <libtorrent/session.hpp>
|
||||
|
||||
std::unique_ptr<lt::disk_interface> customDiskIOConstructor(
|
||||
@@ -42,6 +44,18 @@ std::unique_ptr<lt::disk_interface> customDiskIOConstructor(
|
||||
return std::make_unique<CustomDiskIOThread>(lt::default_disk_io_constructor(ioContext, settings, counters));
|
||||
}
|
||||
|
||||
std::unique_ptr<lt::disk_interface> customPosixDiskIOConstructor(
|
||||
lt::io_context &ioContext, const lt::settings_interface &settings, lt::counters &counters)
|
||||
{
|
||||
return std::make_unique<CustomDiskIOThread>(lt::posix_disk_io_constructor(ioContext, settings, counters));
|
||||
}
|
||||
|
||||
std::unique_ptr<lt::disk_interface> customMMapDiskIOConstructor(
|
||||
lt::io_context &ioContext, const lt::settings_interface &settings, lt::counters &counters)
|
||||
{
|
||||
return std::make_unique<CustomDiskIOThread>(lt::mmap_disk_io_constructor(ioContext, settings, counters));
|
||||
}
|
||||
|
||||
CustomDiskIOThread::CustomDiskIOThread(std::unique_ptr<libtorrent::disk_interface> nativeDiskIOThread)
|
||||
: m_nativeDiskIO {std::move(nativeDiskIOThread)}
|
||||
{
|
||||
|
||||
@@ -50,6 +50,10 @@
|
||||
#ifdef QBT_USES_LIBTORRENT2
|
||||
std::unique_ptr<lt::disk_interface> customDiskIOConstructor(
|
||||
lt::io_context &ioContext, lt::settings_interface const &settings, lt::counters &counters);
|
||||
std::unique_ptr<lt::disk_interface> customPosixDiskIOConstructor(
|
||||
lt::io_context &ioContext, lt::settings_interface const &settings, lt::counters &counters);
|
||||
std::unique_ptr<lt::disk_interface> customMMapDiskIOConstructor(
|
||||
lt::io_context &ioContext, lt::settings_interface const &settings, lt::counters &counters);
|
||||
|
||||
class CustomDiskIOThread final : public lt::disk_interface
|
||||
{
|
||||
|
||||
@@ -381,6 +381,7 @@ Session::Session(QObject *parent)
|
||||
, m_diskCacheSize(BITTORRENT_SESSION_KEY(u"DiskCacheSize"_qs), -1)
|
||||
, m_diskCacheTTL(BITTORRENT_SESSION_KEY(u"DiskCacheTTL"_qs), 60)
|
||||
, m_diskQueueSize(BITTORRENT_SESSION_KEY(u"DiskQueueSize"_qs), (1024 * 1024))
|
||||
, m_diskIOType(BITTORRENT_SESSION_KEY(u"DiskIOType"_qs), DiskIOType::Default)
|
||||
, m_useOSCache(BITTORRENT_SESSION_KEY(u"UseOSCache"_qs), true)
|
||||
#ifdef Q_OS_WIN
|
||||
, m_coalesceReadWriteEnabled(BITTORRENT_SESSION_KEY(u"CoalesceReadWrite"_qs), true)
|
||||
@@ -1149,7 +1150,18 @@ void Session::initializeNativeSession()
|
||||
loadLTSettings(pack);
|
||||
lt::session_params sessionParams {pack, {}};
|
||||
#ifdef QBT_USES_LIBTORRENT2
|
||||
sessionParams.disk_io_constructor = customDiskIOConstructor;
|
||||
switch (diskIOType())
|
||||
{
|
||||
case DiskIOType::Posix:
|
||||
sessionParams.disk_io_constructor = customPosixDiskIOConstructor;
|
||||
break;
|
||||
case DiskIOType::MMap:
|
||||
sessionParams.disk_io_constructor = customMMapDiskIOConstructor;
|
||||
break;
|
||||
default:
|
||||
sessionParams.disk_io_constructor = customDiskIOConstructor;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
m_nativeSession = new lt::session {sessionParams};
|
||||
|
||||
@@ -3363,6 +3375,19 @@ void Session::setPeerTurnoverInterval(const int val)
|
||||
configureDeferred();
|
||||
}
|
||||
|
||||
DiskIOType Session::diskIOType() const
|
||||
{
|
||||
return m_diskIOType;
|
||||
}
|
||||
|
||||
void Session::setDiskIOType(const DiskIOType type)
|
||||
{
|
||||
if (type != m_diskIOType)
|
||||
{
|
||||
m_diskIOType = type;
|
||||
}
|
||||
}
|
||||
|
||||
int Session::requestQueueSize() const
|
||||
{
|
||||
return m_requestQueueSize;
|
||||
|
||||
@@ -122,6 +122,14 @@ namespace BitTorrent
|
||||
};
|
||||
Q_ENUM_NS(ChokingAlgorithm)
|
||||
|
||||
enum class DiskIOType : int
|
||||
{
|
||||
Default = 0,
|
||||
MMap = 1,
|
||||
Posix = 2
|
||||
};
|
||||
Q_ENUM_NS(DiskIOType)
|
||||
|
||||
enum class MixedModeAlgorithm : int
|
||||
{
|
||||
TCP = 0,
|
||||
@@ -368,6 +376,8 @@ namespace BitTorrent
|
||||
void setDiskCacheTTL(int ttl);
|
||||
qint64 diskQueueSize() const;
|
||||
void setDiskQueueSize(qint64 size);
|
||||
DiskIOType diskIOType() const;
|
||||
void setDiskIOType(DiskIOType type);
|
||||
bool useOSCache() const;
|
||||
void setUseOSCache(bool use);
|
||||
bool isCoalesceReadWriteEnabled() const;
|
||||
@@ -689,6 +699,7 @@ namespace BitTorrent
|
||||
CachedSettingValue<int> m_diskCacheSize;
|
||||
CachedSettingValue<int> m_diskCacheTTL;
|
||||
CachedSettingValue<qint64> m_diskQueueSize;
|
||||
CachedSettingValue<DiskIOType> m_diskIOType;
|
||||
CachedSettingValue<bool> m_useOSCache;
|
||||
CachedSettingValue<bool> m_coalesceReadWriteEnabled;
|
||||
CachedSettingValue<bool> m_usePieceExtentAffinity;
|
||||
|
||||
Reference in New Issue
Block a user