From 1ac4cdcf4d607eabb2ab25e468e4a2a37c33815b Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Fri, 11 Aug 2017 19:48:58 +0800 Subject: [PATCH] Add send_buffer_watermark send_buffer_low_watermark send_buffer_watermark_factor knobs --- src/base/bittorrent/session.cpp | 50 +++++++++++++++++++++++++++++++++ src/base/bittorrent/session.h | 9 ++++++ src/gui/advancedsettings.cpp | 23 +++++++++++++++ src/gui/advancedsettings.h | 3 +- 4 files changed, 84 insertions(+), 1 deletion(-) diff --git a/src/base/bittorrent/session.cpp b/src/base/bittorrent/session.cpp index 373466f2c..2f1288397 100644 --- a/src/base/bittorrent/session.cpp +++ b/src/base/bittorrent/session.cpp @@ -265,6 +265,9 @@ Session::Session(QObject *parent) , m_useOSCache(BITTORRENT_SESSION_KEY("UseOSCache"), true) , m_guidedReadCacheEnabled(BITTORRENT_SESSION_KEY("GuidedReadCache"), true) , m_isSuggestMode(BITTORRENT_SESSION_KEY("SuggestMode"), false) + , m_sendBufferWatermark(BITTORRENT_SESSION_KEY("SendBufferWatermark"), 500) + , m_sendBufferLowWatermark(BITTORRENT_SESSION_KEY("SendBufferLowWatermark"), 10) + , m_sendBufferWatermarkFactor(BITTORRENT_SESSION_KEY("SendBufferWatermarkFactor"), 50) , m_isAnonymousModeEnabled(BITTORRENT_SESSION_KEY("AnonymousModeEnabled"), false) , m_isQueueingEnabled(BITTORRENT_SESSION_KEY("QueueingSystemEnabled"), true) , m_maxActiveDownloads(BITTORRENT_SESSION_KEY("MaxActiveDownloads"), 3, lowerLimited(-1)) @@ -1279,6 +1282,10 @@ void Session::configure(libtorrent::settings_pack &settingsPack) settingsPack.set_bool(libt::settings_pack::guided_read_cache, isGuidedReadCacheEnabled()); settingsPack.set_bool(libt::settings_pack::suggest_mode, isSuggestModeEnabled()); + settingsPack.set_int(libt::settings_pack::send_buffer_watermark, sendBufferWatermark() * 1024); + settingsPack.set_int(libt::settings_pack::send_buffer_low_watermark, sendBufferLowWatermark() * 1024); + settingsPack.set_int(libt::settings_pack::send_buffer_watermark_factor, sendBufferWatermarkFactor()); + settingsPack.set_bool(libt::settings_pack::anonymous_mode, isAnonymousModeEnabled()); // Queueing System @@ -1521,6 +1528,10 @@ void Session::configure(libtorrent::session_settings &sessionSettings) sessionSettings.guided_read_cache = isGuidedReadCacheEnabled(); sessionSettings.suggest_mode = isSuggestModeEnabled(); + sessionSettings.send_buffer_watermark = sendBufferWatermark() * 1024; + sessionSettings.send_buffer_low_watermark = sendBufferLowWatermark() * 1024; + sessionSettings.send_buffer_watermark_factor = sendBufferWatermarkFactor(); + sessionSettings.anonymous_mode = isAnonymousModeEnabled(); // Queueing System @@ -2949,6 +2960,45 @@ void Session::setSuggestMode(bool mode) configureDeferred(); } +int Session::sendBufferWatermark() const +{ + return m_sendBufferWatermark; +} + +void Session::setSendBufferWatermark(int value) +{ + if (value == m_sendBufferWatermark) return; + + m_sendBufferWatermark = value; + configureDeferred(); +} + +int Session::sendBufferLowWatermark() const +{ + return m_sendBufferLowWatermark; +} + +void Session::setSendBufferLowWatermark(int value) +{ + if (value == m_sendBufferLowWatermark) return; + + m_sendBufferLowWatermark = value; + configureDeferred(); +} + +int Session::sendBufferWatermarkFactor() const +{ + return m_sendBufferWatermarkFactor; +} + +void Session::setSendBufferWatermarkFactor(int value) +{ + if (value == m_sendBufferWatermarkFactor) return; + + m_sendBufferWatermarkFactor = value; + configureDeferred(); +} + bool Session::isAnonymousModeEnabled() const { return m_isAnonymousModeEnabled; diff --git a/src/base/bittorrent/session.h b/src/base/bittorrent/session.h index cf5f6bffa..0869fb52e 100644 --- a/src/base/bittorrent/session.h +++ b/src/base/bittorrent/session.h @@ -341,6 +341,12 @@ namespace BitTorrent void setGuidedReadCacheEnabled(bool enabled); bool isSuggestModeEnabled() const; void setSuggestMode(bool mode); + int sendBufferWatermark() const; + void setSendBufferWatermark(int value); + int sendBufferLowWatermark() const; + void setSendBufferLowWatermark(int value); + int sendBufferWatermarkFactor() const; + void setSendBufferWatermarkFactor(int value); bool isAnonymousModeEnabled() const; void setAnonymousModeEnabled(bool enabled); bool isQueueingSystemEnabled() const; @@ -590,6 +596,9 @@ namespace BitTorrent CachedSettingValue m_useOSCache; CachedSettingValue m_guidedReadCacheEnabled; CachedSettingValue m_isSuggestMode; + CachedSettingValue m_sendBufferWatermark; + CachedSettingValue m_sendBufferLowWatermark; + CachedSettingValue m_sendBufferWatermarkFactor; CachedSettingValue m_isAnonymousModeEnabled; CachedSettingValue m_isQueueingEnabled; CachedSettingValue m_maxActiveDownloads; diff --git a/src/gui/advancedsettings.cpp b/src/gui/advancedsettings.cpp index be71e00a1..d632ef3e9 100644 --- a/src/gui/advancedsettings.cpp +++ b/src/gui/advancedsettings.cpp @@ -80,6 +80,9 @@ enum AdvSettingsRows OS_CACHE, GUIDED_READ_CACHE, SUGGEST_MODE, + SEND_BUF_WATERMARK, + SEND_BUF_LOW_WATERMARK, + SEND_BUF_WATERMARK_FACTOR, // ports MAX_HALF_OPEN, OUTGOING_PORT_MIN, @@ -137,6 +140,10 @@ void AdvancedSettings::saveAdvancedSettings() session->setGuidedReadCacheEnabled(cbGuidedReadCache.isChecked()); // Suggest mode session->setSuggestMode(cbSuggestMode.isChecked()); + // Send buffer watermark + session->setSendBufferWatermark(spinSendBufferWatermark.value()); + session->setSendBufferLowWatermark(spinSendBufferLowWatermark.value()); + session->setSendBufferWatermarkFactor(spinSendBufferWatermarkFactor.value()); // Save resume data interval session->setSaveResumeDataInterval(spin_save_resume_data_interval.value()); // Outgoing ports @@ -303,6 +310,22 @@ void AdvancedSettings::loadAdvancedSettings() // Suggest mode cbSuggestMode.setChecked(session->isSuggestModeEnabled()); addRow(SUGGEST_MODE, tr("Send upload piece suggestions"), &cbSuggestMode); + // Send buffer watermark + spinSendBufferWatermark.setMinimum(1); + spinSendBufferWatermark.setMaximum(INT_MAX); + spinSendBufferWatermark.setSuffix(tr(" KiB")); + spinSendBufferWatermark.setValue(session->sendBufferWatermark()); + addRow(SEND_BUF_WATERMARK, tr("Send buffer watermark"), &spinSendBufferWatermark); + spinSendBufferLowWatermark.setMinimum(1); + spinSendBufferLowWatermark.setMaximum(INT_MAX); + spinSendBufferLowWatermark.setSuffix(tr(" KiB")); + spinSendBufferLowWatermark.setValue(session->sendBufferLowWatermark()); + addRow(SEND_BUF_LOW_WATERMARK, tr("Send buffer low watermark"), &spinSendBufferLowWatermark); + spinSendBufferWatermarkFactor.setMinimum(1); + spinSendBufferWatermarkFactor.setMaximum(INT_MAX); + spinSendBufferWatermarkFactor.setSuffix(" %"); + spinSendBufferWatermarkFactor.setValue(session->sendBufferWatermarkFactor()); + addRow(SEND_BUF_WATERMARK_FACTOR, tr("Send buffer watermark factor"), &spinSendBufferWatermarkFactor); // Save resume data interval spin_save_resume_data_interval.setMinimum(1); spin_save_resume_data_interval.setMaximum(1440); diff --git a/src/gui/advancedsettings.h b/src/gui/advancedsettings.h index 60d45ff44..d780db5e5 100644 --- a/src/gui/advancedsettings.h +++ b/src/gui/advancedsettings.h @@ -75,7 +75,8 @@ private: template void addRow(int row, const QString &rowText, T* widget); QLabel labelQbtLink, labelLibtorrentLink; - QSpinBox spin_cache, spin_save_resume_data_interval, outgoing_ports_min, outgoing_ports_max, spin_list_refresh, spin_maxhalfopen, spin_tracker_port, spin_cache_ttl; + QSpinBox spin_cache, spin_save_resume_data_interval, outgoing_ports_min, outgoing_ports_max, spin_list_refresh, spin_maxhalfopen, spin_tracker_port, spin_cache_ttl, + spinSendBufferWatermark, spinSendBufferLowWatermark, spinSendBufferWatermarkFactor; QCheckBox cb_os_cache, cb_recheck_completed, cb_resolve_countries, cb_resolve_hosts, cb_super_seeding, cb_program_notifications, cb_torrent_added_notifications, cb_tracker_favicon, cb_tracker_status, cb_confirm_torrent_recheck, cb_confirm_remove_all_tags, cb_listen_ipv6, cb_announce_all_trackers, cbGuidedReadCache, cbMultiConnectionsPerIp,