← Back to team overview

linuxdcpp-team team mailing list archive

[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;
 	}