diff --git a/doc/rtorrent.1.xml b/doc/rtorrent.1.xml
index d41de58b..aa31331b 100644
--- a/doc/rtorrent.1.xml
+++ b/doc/rtorrent.1.xml
@@ -425,6 +425,16 @@
+
+ throttle_interval = ms
+
+ Interval between throttle ticks in milli-seconds, must be
+ between 1-5000 and defaults to
+ 1000 . Shorter intervals will cause less
+ bandwidth usage spikes while requiring more CPU resources.
+
+
+
tracker_dump = yes | no
diff --git a/doc/rtorrent.rc b/doc/rtorrent.rc
index 21af8b37..f64d2a22 100644
--- a/doc/rtorrent.rc
+++ b/doc/rtorrent.rc
@@ -58,3 +58,7 @@
# Dump data received from trackers to the files "./tracker_dump.".
#tracker_dump = no
+
+# Change the interval between each throttle tick, in milliseconds. In
+# the range 1-5000 ms.
+#throttle_interval = 1000
diff --git a/src/main.cc b/src/main.cc
index d8cd5018..da25deca 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -117,25 +117,27 @@ parse_options(ui::Control* c, OptionHandler* optionHandler, int argc, char** arg
void
initialize_option_handler(ui::Control* c, OptionHandler* optionHandler) {
- optionHandler->insert("max_peers", new OptionHandlerInt(c, &apply_download_max_peers, &validate_download_peers));
- optionHandler->insert("min_peers", new OptionHandlerInt(c, &apply_download_min_peers, &validate_download_peers));
- optionHandler->insert("max_uploads", new OptionHandlerInt(c, &apply_download_max_uploads, &validate_download_peers));
+ optionHandler->insert("max_peers", new OptionHandlerInt(c, &apply_download_max_peers, &validate_download_peers));
+ optionHandler->insert("min_peers", new OptionHandlerInt(c, &apply_download_min_peers, &validate_download_peers));
+ optionHandler->insert("max_uploads", new OptionHandlerInt(c, &apply_download_max_uploads, &validate_download_peers));
- optionHandler->insert("download_rate", new OptionHandlerInt(c, &apply_global_download_rate, &validate_rate));
- optionHandler->insert("upload_rate", new OptionHandlerInt(c, &apply_global_upload_rate, &validate_rate));
+ optionHandler->insert("download_rate", new OptionHandlerInt(c, &apply_global_download_rate, &validate_rate));
+ optionHandler->insert("upload_rate", new OptionHandlerInt(c, &apply_global_upload_rate, &validate_rate));
- optionHandler->insert("bind", new OptionHandlerString(c, &apply_bind, &validate_ip));
- optionHandler->insert("ip", new OptionHandlerString(c, &apply_ip, &validate_ip));
- optionHandler->insert("port_range", new OptionHandlerString(c, &apply_port_range, &validate_port_range));
- optionHandler->insert("port_random", new OptionHandlerString(c, &apply_port_random, &validate_yes_no));
+ optionHandler->insert("bind", new OptionHandlerString(c, &apply_bind, &validate_ip));
+ optionHandler->insert("ip", new OptionHandlerString(c, &apply_ip, &validate_ip));
+ optionHandler->insert("port_range", new OptionHandlerString(c, &apply_port_range, &validate_port_range));
+ optionHandler->insert("port_random", new OptionHandlerString(c, &apply_port_random, &validate_yes_no));
- optionHandler->insert("check_hash", new OptionHandlerString(c, &apply_check_hash, &validate_yes_no));
- optionHandler->insert("directory", new OptionHandlerString(c, &apply_download_directory, &validate_directory));
+ optionHandler->insert("check_hash", new OptionHandlerString(c, &apply_check_hash, &validate_yes_no));
+ optionHandler->insert("directory", new OptionHandlerString(c, &apply_download_directory, &validate_directory));
- optionHandler->insert("hash_read_ahead", new OptionHandlerInt(c, &apply_hash_read_ahead, &validate_read_ahead));
- optionHandler->insert("max_open_files", new OptionHandlerInt(c, &apply_max_open_files, &validate_fd));
- optionHandler->insert("session", new OptionHandlerString(c, &apply_session_directory, &validate_directory));
- optionHandler->insert("tracker_dump", new OptionHandlerString(c, &apply_tracker_dump, &validate_yes_no));
+ optionHandler->insert("hash_read_ahead", new OptionHandlerInt(c, &apply_hash_read_ahead, &validate_read_ahead));
+ optionHandler->insert("max_open_files", new OptionHandlerInt(c, &apply_max_open_files, &validate_fd));
+ optionHandler->insert("throttle_interval", new OptionHandlerInt(c, &apply_throttle_interval, &validate_throttle_interval));
+
+ optionHandler->insert("session", new OptionHandlerString(c, &apply_session_directory, &validate_directory));
+ optionHandler->insert("tracker_dump", new OptionHandlerString(c, &apply_tracker_dump, &validate_yes_no));
}
void
diff --git a/src/option_handler_rules.cc b/src/option_handler_rules.cc
index eefbcc61..e41c48b6 100644
--- a/src/option_handler_rules.cc
+++ b/src/option_handler_rules.cc
@@ -80,6 +80,11 @@ validate_fd(int arg) {
return arg >= 10 && arg < (1 << 16);
}
+bool
+validate_throttle_interval(int arg) {
+ return arg > 0 && arg < 5000;
+}
+
void
apply_download_min_peers(ui::Control* m, int arg) {
m->get_core().get_download_list().slot_map_insert().insert("1_min_peers", sigc::bind(sigc::mem_fun(&core::Download::call), arg));
@@ -123,6 +128,11 @@ apply_max_open_files(ui::Control* m, int arg) {
torrent::set_max_open_files(arg);
}
+void
+apply_throttle_interval(ui::Control* m, int arg) {
+ torrent::set_throttle_interval(arg * 1000);
+}
+
void
apply_bind(ui::Control* m, const std::string& arg) {
torrent::set_bind(arg);
diff --git a/src/option_handler_rules.h b/src/option_handler_rules.h
index 26cd99fc..016f162b 100644
--- a/src/option_handler_rules.h
+++ b/src/option_handler_rules.h
@@ -44,6 +44,8 @@ bool validate_rate(int arg);
bool validate_read_ahead(int arg);
bool validate_fd(int arg);
+bool validate_throttle_interval(int arg);
+
void apply_download_min_peers(ui::Control* m, int arg);
void apply_download_max_peers(ui::Control* m, int arg);
void apply_download_max_uploads(ui::Control* m, int arg);
@@ -55,6 +57,7 @@ void apply_global_upload_rate(ui::Control* m, int arg);
void apply_hash_read_ahead(ui::Control* m, int arg);
void apply_max_open_files(ui::Control* m, int arg);
+void apply_throttle_interval(ui::Control* m, int arg);
void apply_ip(ui::Control* m, const std::string& arg);
void apply_bind(ui::Control* m, const std::string& arg);