linuxdcpp-team team mailing list archive
-
linuxdcpp-team team
-
Mailing list archive
-
Message #03996
[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 2500: bandwidth limiting tweaks
------------------------------------------------------------
revno: 2500
committer: poy <poy@xxxxxxxxxx>
branch nick: trunk
timestamp: Mon 2011-04-18 20:41:36 +0200
message:
bandwidth limiting tweaks
modified:
changelog.txt
dcpp/ThrottleManager.cpp
dcpp/ThrottleManager.h
win32/BandwidthLimitPage.cpp
win32/MainWindow.cpp
win32/MainWindow.h
win32/WinUtil.cpp
--
lp:dcplusplus
https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk
Your team Dcplusplus-team is subscribed to branch lp:dcplusplus.
To unsubscribe from this branch go to https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk/+edit-subscription
=== modified file 'changelog.txt'
--- changelog.txt 2011-04-17 20:56:38 +0000
+++ changelog.txt 2011-04-18 18:41:36 +0000
@@ -22,6 +22,7 @@
* Fix Ctrl+W / Ctrl+F4 sometimes closing the wrong tab (poy)
* [L#604983] Fix transfers dying on setting upload/download throttle to 0 (cologic)
* [L#702498] Menus to adjust the bw limit from the tray menu & status bar (poy, iceman50)
+* Increase the max bandwidth limit from 32 MiB/s to 1 GiB/s
-- 0.782 2011-03-05 --
* Prevent a remote crash triggered via malformed user commands (poy)
=== modified file 'dcpp/ThrottleManager.cpp'
--- dcpp/ThrottleManager.cpp 2011-04-17 20:29:37 +0000
+++ dcpp/ThrottleManager.cpp 2011-04-18 18:41:36 +0000
@@ -148,6 +148,11 @@
return SettingsManager::getInstance()->get(getCurSetting(SettingsManager::MAX_DOWNLOAD_SPEED_MAIN));
}
+void ThrottleManager::setSetting(SettingsManager::IntSetting setting, int value) {
+ SettingsManager::getInstance()->set(setting, value);
+ ClientManager::getInstance()->infoUpdated();
+}
+
bool ThrottleManager::getCurThrottling() {
Lock l(stateCS);
return activeWaiter != -1;
@@ -188,8 +193,7 @@
{
int newSlots = SettingsManager::getInstance()->get(getCurSetting(SettingsManager::SLOTS));
if(newSlots != SETTING(SLOTS)) {
- SettingsManager::getInstance()->set(SettingsManager::SLOTS, newSlots);
- ClientManager::getInstance()->infoUpdated();
+ setSetting(SettingsManager::SLOTS, newSlots);
}
{
=== modified file 'dcpp/ThrottleManager.h'
--- dcpp/ThrottleManager.h 2011-04-13 19:16:51 +0000
+++ dcpp/ThrottleManager.h 2011-04-18 18:41:36 +0000
@@ -46,12 +46,17 @@
*/
int write(Socket* sock, void* buffer, size_t& len);
- SettingsManager::IntSetting getCurSetting(SettingsManager::IntSetting setting);
-
- int getUpLimit();
- int getDownLimit();
-
void shutdown();
+
+ static SettingsManager::IntSetting getCurSetting(SettingsManager::IntSetting setting);
+
+ static int getUpLimit();
+ static int getDownLimit();
+
+ static void setSetting(SettingsManager::IntSetting setting, int value);
+
+ static const unsigned MAX_LIMIT = 1024 * 1024; // 1 GiB/s
+
private:
// stack up throttled read & write threads
CriticalSection stateCS;
=== modified file 'win32/BandwidthLimitPage.cpp'
--- win32/BandwidthLimitPage.cpp 2011-04-05 19:16:53 +0000
+++ win32/BandwidthLimitPage.cpp 2011-04-18 18:41:36 +0000
@@ -25,6 +25,7 @@
#include <dwt/widgets/Spinner.h>
#include <dcpp/SettingsManager.h>
+#include <dcpp/ThrottleManager.h>
#include "WinUtil.h"
BandwidthLimitPage::BandwidthLimitPage(dwt::Widget* parent) :
@@ -49,14 +50,14 @@
{
main = grid->addChild(GroupBox::Seed(T_("Transfer Rate Limiting")));
GridPtr cur = main->addChild(Grid::Seed(2, 2));
- cur->column(0).size = 50;
+ cur->column(0).size = 70;
cur->column(0).mode = GridInfo::STATIC;
TextBoxPtr box = cur->addChild(WinUtil::Seeds::Dialog::intTextBox);
box->setHelpId(IDH_SETTINGS_BWLIMIT_UPLOAD);
items.push_back(Item(box, SettingsManager::MAX_UPLOAD_SPEED_MAIN, PropPage::T_INT_WITH_SPIN));
- SpinnerPtr spin = cur->addChild(Spinner::Seed(0, UD_MAXVAL, box));
+ SpinnerPtr spin = cur->addChild(Spinner::Seed(0, ThrottleManager::MAX_LIMIT, box));
spin->setHelpId(IDH_SETTINGS_BWLIMIT_UPLOAD);
cur->setWidget(spin);
@@ -66,7 +67,7 @@
box->setHelpId(IDH_SETTINGS_BWLIMIT_DOWNLOAD);
items.push_back(Item(box, SettingsManager::MAX_DOWNLOAD_SPEED_MAIN, PropPage::T_INT_WITH_SPIN));
- spin = cur->addChild(Spinner::Seed(0, UD_MAXVAL, box));
+ spin = cur->addChild(Spinner::Seed(0, ThrottleManager::MAX_LIMIT, box));
spin->setHelpId(IDH_SETTINGS_BWLIMIT_DOWNLOAD);
cur->setWidget(spin);
@@ -108,14 +109,14 @@
{
secondary = grid->addChild(GroupBox::Seed(T_("Secondary Transfer Rate Limiting Settings")));
GridPtr cur = secondary->addChild(Grid::Seed(3, 2));
- cur->column(0).size = 50;
+ cur->column(0).size = 70;
cur->column(0).mode = GridInfo::STATIC;
TextBoxPtr box = cur->addChild(WinUtil::Seeds::Dialog::intTextBox);
box->setHelpId(IDH_SETTINGS_BWLIMIT_SECONDARY_UPLOAD);
items.push_back(Item(box, SettingsManager::MAX_UPLOAD_SPEED_ALTERNATE, PropPage::T_INT_WITH_SPIN));
- SpinnerPtr spin = cur->addChild(Spinner::Seed(0, UD_MAXVAL, box));
+ SpinnerPtr spin = cur->addChild(Spinner::Seed(0, ThrottleManager::MAX_LIMIT, box));
spin->setHelpId(IDH_SETTINGS_BWLIMIT_SECONDARY_UPLOAD);
cur->setWidget(spin);
@@ -125,7 +126,7 @@
box->setHelpId(IDH_SETTINGS_BWLIMIT_SECONDARY_DOWNLOAD);
items.push_back(Item(box, SettingsManager::MAX_DOWNLOAD_SPEED_ALTERNATE, PropPage::T_INT_WITH_SPIN));
- spin = cur->addChild(Spinner::Seed(0, UD_MAXVAL, box));
+ spin = cur->addChild(Spinner::Seed(0, ThrottleManager::MAX_LIMIT, box));
spin->setHelpId(IDH_SETTINGS_BWLIMIT_SECONDARY_DOWNLOAD);
cur->setWidget(spin);
=== modified file 'win32/MainWindow.cpp'
--- win32/MainWindow.cpp 2011-04-17 21:09:31 +0000
+++ win32/MainWindow.cpp 2011-04-18 18:41:36 +0000
@@ -437,7 +437,7 @@
slotsSpin = addChild(Spinner::Seed(1));
slotsSpin->setHelpId(IDH_MAIN_SLOTS_SPIN);
- slotsSpin->onUpdate([this](int pos, int delta) { return handleSlotsUpdate(pos, delta); });
+ slotsSpin->onUpdate([this](int, int delta) { return handleSlotsUpdate(delta); });
initStatus(true);
status->setSize(STATUS_SLOTS_SPIN, 22);
@@ -683,38 +683,47 @@
}
}
-void fillLimiterMenu(MenuPtr menu, bool upload) {
- menu->setTitle(upload ? T_("Upload limit") : T_("Download limit"));
+void MainWindow::fillLimiterMenu(MenuPtr menu, bool upload) {
+ const auto title = upload ? T_("Upload limit") : T_("Download limit");
+ menu->setTitle(title);
- const auto setting = ThrottleManager::getInstance()->getCurSetting(
+ const auto setting = ThrottleManager::getCurSetting(
upload ? SettingsManager::MAX_UPLOAD_SPEED_MAIN : SettingsManager::MAX_DOWNLOAD_SPEED_MAIN);
- auto x = SettingsManager::getInstance()->get(setting);
+ const auto x = SettingsManager::getInstance()->get(setting);
int arr[] = { 0 /* disabled */, x /* current value */,
x + 1, x + 2, x + 5, x + 10, x + 20, x + 50, x + 100,
x - 1, x - 2, x - 5, x - 10, x - 20, x - 50, x - 100,
- x * 3 / 2, x * 2, x * 3, x * 4, x * 5, x * 10, x * 100,
- x * 2 / 3, x / 2, x / 3, x / 4, x / 5, x / 10, x / 100 };
+ x * 11 / 10, x * 6 / 5, x * 3 / 2, x * 2, x * 3, x * 4, x * 5, x * 10, x * 100,
+ x * 10 / 11, x * 5 / 6, x * 2 / 3, x / 2, x / 3, x / 4, x / 5, x / 10, x / 100 };
- // set ensures unique members; remove_if performs range and relevancy checking.
- set<int> values(arr, std::remove_if(arr, arr + sizeof(arr) / sizeof(int), [x](int i) {
- return i < 0 || i > UD_MAXVAL || // same max value as the one imposed by settings spinners
- (i != x && abs(i - x) < 20 * x / 1024); // not too close to the original value
+ // set ensures ordered unique members; remove_if performs range and relevancy checking.
+ auto minDelta = (x >= 1024) ? (20 * pow(1024, floor(log(static_cast<float>(x)) / log(1024.)) - 1)) : 0;
+ set<int> values(arr, std::remove_if(arr, arr + sizeof(arr) / sizeof(int), [x, minDelta](int i) {
+ return i < 0 || i > ThrottleManager::MAX_LIMIT ||
+ (minDelta && i != x && abs(i - x) < minDelta); // not too close to the original value
}));
for(auto i = values.cbegin(), iend = values.cend(); i != iend; ++i) {
auto value = *i;
auto same = value == x;
auto formatted = Text::toT(Util::formatBytes(value * 1024));
- auto pos = menu->appendItem(value ? escapeMenu(str(TF_("%1%/s") % formatted)) : T_("Disabled"), [setting, value] {
- SettingsManager::getInstance()->set(setting, value);
- ClientManager::getInstance()->infoUpdated();
- }, 0, !same);
+ auto pos = menu->appendItem(value ? escapeMenu(str(TF_("%1%/s") % formatted)) : T_("Disabled"),
+ [setting, value] { ThrottleManager::setSetting(setting, value); }, 0, !same);
if(same)
menu->checkItem(pos);
if(!value)
menu->appendSeparator();
}
+
+ menu->appendSeparator();
+ menu->appendItem(T_("Custom..."), [this, title, setting, x] {
+ ParamDlg dlg(this, title);
+ dlg.addIntTextBox(T_("New limit (KiB/s) (0 = infinite)"), Text::toT(Util::toString(x)), 0, ThrottleManager::MAX_LIMIT);
+ if(dlg.run() == IDOK) {
+ ThrottleManager::setSetting(setting, Util::toUInt(Text::fromT(dlg.getValue())));
+ }
+ });
}
void MainWindow::handleLimiterMenu(bool upload) {
@@ -999,11 +1008,11 @@
status->setText(STATUS_UP_DIFF, str(TF_("%1%/s") % s));
status->setToolTip(STATUS_UP_DIFF, str(TF_("U: %1%/s (%2%)") % s % UploadManager::getInstance()->getUploadCount()));
- s = Text::toT(Util::formatBytes(ThrottleManager::getInstance()->getDownLimit() * 1024));
+ s = Text::toT(Util::formatBytes(ThrottleManager::getDownLimit() * 1024));
status->setText(STATUS_DOWN_LIMIT, str(TF_("D Lim: %1%/s") % s));
status->setToolTip(STATUS_DOWN_LIMIT, str(TF_("Download limit: %1%/s - Click to adjust") % s));
- s = Text::toT(Util::formatBytes(ThrottleManager::getInstance()->getUpLimit() * 1024));
+ s = Text::toT(Util::formatBytes(ThrottleManager::getUpLimit() * 1024));
status->setText(STATUS_UP_LIMIT, str(TF_("U Lim: %1%/s") % s));
status->setToolTip(STATUS_UP_LIMIT, str(TF_("Upload limit: %1%/s - Click to adjust") % s));
@@ -1399,14 +1408,12 @@
layout();
}
-bool MainWindow::handleSlotsUpdate(int /* pos */, int delta) {
+bool MainWindow::handleSlotsUpdate(int delta) {
// Prevent double-info-updated
int newSlots = SETTING(SLOTS) + delta;
SettingsManager::getInstance()->set(SettingsManager::SLOTS, newSlots);
-
- SettingsManager::getInstance()->set(ThrottleManager::getInstance()->getCurSetting(SettingsManager::SLOTS), newSlots);
+ ThrottleManager::setSetting(SettingsManager::SLOTS, newSlots);
updateStatus();
- ClientManager::getInstance()->infoUpdated();
return true;
}
=== modified file 'win32/MainWindow.h'
--- win32/MainWindow.h 2011-04-17 20:56:38 +0000
+++ win32/MainWindow.h 2011-04-18 18:41:36 +0000
@@ -170,7 +170,7 @@
void switchToolbar();
void switchTransfers();
void switchStatus();
- bool handleSlotsUpdate(int pos, int delta);
+ bool handleSlotsUpdate(int delta);
void handleReconnect();
void handleRedirect();
void forwardHub(void (HubFrame::*f_t)());
@@ -198,6 +198,7 @@
void saveWindowSettings();
void parseCommandLine(const tstring& line);
bool chooseFavHubGroup(const tstring& title, tstring& group);
+ void fillLimiterMenu(MenuPtr menu, bool upload);
void statusMessage(time_t t, const string& m);
bool filter(MSG& msg);
=== modified file 'win32/WinUtil.cpp'
--- win32/WinUtil.cpp 2011-04-16 14:19:18 +0000
+++ win32/WinUtil.cpp 2011-04-18 18:41:36 +0000
@@ -467,9 +467,8 @@
} else if(Util::stricmp(cmd.c_str(), _T("slots")) == 0) {
int j = Util::toInt(Text::fromT(param));
if(j > 0) {
- SettingsManager::getInstance()->set(ThrottleManager::getInstance()->getCurSetting(SettingsManager::SLOTS), j);
+ ThrottleManager::setSetting(ThrottleManager::getCurSetting(SettingsManager::SLOTS), j);
status = T_("Slots set");
- ClientManager::getInstance()->infoUpdated();
} else {
status = T_("Invalid number of slots");
}
@@ -525,30 +524,13 @@
} else if(Util::stricmp(cmd.c_str(), _T("rebuild")) == 0) {
HashManager::getInstance()->rebuild();
} else if(Util::stricmp(cmd.c_str(), _T("upload")) == 0) {
- SettingsManager::getInstance()->set(ThrottleManager::getInstance()->getCurSetting(SettingsManager::MAX_UPLOAD_SPEED_MAIN), Util::toInt(Text::fromT(param)));
- ClientManager::getInstance()->infoUpdated();
- if(Util::toInt(Text::fromT(param))) {
- TCHAR* temp;
- temp = new TCHAR[T_("Upload limit set to %d KiB/s").size() + 32];
- _stprintf(temp, T_("Upload limit set to %d KiB/s").c_str(), Util::toInt(Text::fromT(param)));
- status = temp;
- delete[] temp;
- } else {
- status = T_("Upload limit disabled").c_str();
- }
+ auto value = Util::toInt(Text::fromT(param));
+ ThrottleManager::setSetting(ThrottleManager::getCurSetting(SettingsManager::MAX_UPLOAD_SPEED_MAIN), value);
+ status = value ? str(TF_("Upload limit set to %1% KiB/s") % value) : T_("Upload limit disabled");
} else if(Util::stricmp(cmd.c_str(), _T("download")) == 0) {
- SettingsManager::getInstance()->set(ThrottleManager::getInstance()->getCurSetting(SettingsManager::MAX_DOWNLOAD_SPEED_MAIN),
- Util::toInt(Text::fromT(param)));
- ClientManager::getInstance()->infoUpdated();
- if(Util::toInt(Text::fromT(param))) {
- TCHAR* temp;
- temp = new TCHAR[T_("Download limit set to %d KiB/s").size() + 32];
- _stprintf(temp, T_("Download limit set to %d KiB/s").c_str(), Util::toInt(Text::fromT(param)));
- status = temp;
- delete[] temp;
- } else {
- status = T_("Download limit disabled");
- }
+ auto value = Util::toInt(Text::fromT(param));
+ ThrottleManager::setSetting(ThrottleManager::getCurSetting(SettingsManager::MAX_DOWNLOAD_SPEED_MAIN), value);
+ status = value ? str(TF_("Download limit set to %1% KiB/s") % value) : T_("Download limit disabled");
} else {
return false;
}