From 80d6a5a73e6459117af1f6173fb74c7d2c843f6f Mon Sep 17 00:00:00 2001 From: sledgehammer999 Date: Thu, 7 Aug 2014 22:30:54 +0300 Subject: [PATCH] Allow disabling of OS cache. This will prevent RAM increases on Windows when seeding many files. Closes #1699. --- src/preferences/advancedsettings.h | 9 +++++++-- src/preferences/preferences.cpp | 8 ++++++++ src/preferences/preferences.h | 2 ++ src/qtlibtorrent/qbtsession.cpp | 3 +++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/preferences/advancedsettings.h b/src/preferences/advancedsettings.h index 248478235..4a827c8ad 100644 --- a/src/preferences/advancedsettings.h +++ b/src/preferences/advancedsettings.h @@ -13,7 +13,7 @@ #include "preferences.h" enum AdvSettingsCols {PROPERTY, VALUE}; -enum AdvSettingsRows {DISK_CACHE, DISK_CACHE_TTL, OUTGOING_PORT_MIN, OUTGOING_PORT_MAX, IGNORE_LIMIT_LAN, RECHECK_COMPLETED, LIST_REFRESH, RESOLVE_COUNTRIES, RESOLVE_HOSTS, MAX_HALF_OPEN, SUPER_SEEDING, NETWORK_IFACE, NETWORK_ADDRESS, PROGRAM_NOTIFICATIONS, TRACKER_STATUS, TRACKER_PORT, +enum AdvSettingsRows {DISK_CACHE, DISK_CACHE_TTL, OS_CACHE, OUTGOING_PORT_MIN, OUTGOING_PORT_MAX, IGNORE_LIMIT_LAN, RECHECK_COMPLETED, LIST_REFRESH, RESOLVE_COUNTRIES, RESOLVE_HOSTS, MAX_HALF_OPEN, SUPER_SEEDING, NETWORK_IFACE, NETWORK_ADDRESS, PROGRAM_NOTIFICATIONS, TRACKER_STATUS, TRACKER_PORT, #if defined(Q_OS_WIN) || defined(Q_OS_MAC) UPDATE_CHECK, #endif @@ -29,7 +29,7 @@ class AdvancedSettings: public QTableWidget { private: QSpinBox spin_cache, outgoing_ports_min, outgoing_ports_max, spin_list_refresh, spin_maxhalfopen, spin_tracker_port; - QCheckBox cb_ignore_limits_lan, cb_recheck_completed, cb_resolve_countries, cb_resolve_hosts, + QCheckBox cb_os_cache, cb_ignore_limits_lan, cb_recheck_completed, cb_resolve_countries, cb_resolve_hosts, cb_super_seeding, cb_program_notifications, cb_tracker_status, cb_confirm_torrent_deletion, cb_enable_tracker_ext; QComboBox combo_iface; @@ -71,6 +71,8 @@ public slots: // Disk write cache pref->setDiskCacheSize(spin_cache.value()); pref->setDiskCacheTTL(spin_cache_ttl.value()); + // Enable OS cache + pref->setOsCache(cb_os_cache.isChecked()); // Outgoing ports pref->setOutgoingPortsMin(outgoing_ports_min.value()); pref->setOutgoingPortsMax(outgoing_ports_max.value()); @@ -188,6 +190,9 @@ private slots: spin_cache_ttl.setValue(pref->diskCacheTTL()); spin_cache_ttl.setSuffix(tr(" s", " seconds")); setRow(DISK_CACHE_TTL, tr("Disk cache expiry interval"), &spin_cache_ttl); + // Enable OS cache + cb_os_cache.setChecked(pref->osCache()); + setRow(OS_CACHE, tr("Enable OS cache"), &cb_os_cache); // Outgoing port Min outgoing_ports_min.setMinimum(0); outgoing_ports_min.setMaximum(65535); diff --git a/src/preferences/preferences.cpp b/src/preferences/preferences.cpp index 3bf25b7e5..fbfeefcc3 100644 --- a/src/preferences/preferences.cpp +++ b/src/preferences/preferences.cpp @@ -1139,6 +1139,14 @@ void Preferences::setDiskCacheTTL(uint ttl) { setValue("Preferences/Downloads/DiskWriteCacheTTL", ttl); } +bool Preferences::osCache() const { + return value("Preferences/Advanced/osCache", true).toBool(); +} + +void Preferences::setOsCache(bool enable) { + setValue("Preferences/Advanced/osCache", enable); +} + uint Preferences::outgoingPortsMin() const { return value("Preferences/Advanced/OutgoingPortsMin", 0).toUInt(); } diff --git a/src/preferences/preferences.h b/src/preferences/preferences.h index 5e9308bb7..fa32e2076 100755 --- a/src/preferences/preferences.h +++ b/src/preferences/preferences.h @@ -308,6 +308,8 @@ public: void setDiskCacheSize(uint size); uint diskCacheTTL() const; void setDiskCacheTTL(uint ttl); + bool osCache() const; + void setOsCache(bool enable); uint outgoingPortsMin() const; void setOutgoingPortsMin(uint val); uint outgoingPortsMax() const; diff --git a/src/qtlibtorrent/qbtsession.cpp b/src/qtlibtorrent/qbtsession.cpp index fa259e0a9..7e4046b5b 100755 --- a/src/qtlibtorrent/qbtsession.cpp +++ b/src/qtlibtorrent/qbtsession.cpp @@ -411,6 +411,9 @@ void QBtSession::configureSession() { sessionSettings.cache_size = cache_size ? cache_size * 64 : -1; sessionSettings.cache_expiry = pref->diskCacheTTL(); qDebug() << "Using a disk cache size of" << cache_size << "MiB"; + session_settings::io_buffer_mode_t mode = pref->osCache() ? session_settings::enable_os_cache : session_settings::disable_os_cache; + sessionSettings.disk_io_read_mode = mode; + sessionSettings.disk_io_write_mode = mode; sessionSettings.anonymous_mode = pref->isAnonymousModeEnabled(); if (sessionSettings.anonymous_mode) { addConsoleMessage(tr("Anonymous mode [ON]"), "blue");