From ce166217075e2368e8ad19ef91737fad2e3f918f Mon Sep 17 00:00:00 2001 From: rakshasa Date: Sat, 6 Aug 2011 05:20:18 +0000 Subject: [PATCH] * Fixed a potential issue causing high loads while waiting for main thread to exit polling. #2661 * Added 'strings.choke_heuristics.{upload,download}' and extra dummy upload/download heuristics for testings. git-svn-id: svn://rakshasa.no/libtorrent/trunk/rtorrent@1263 e378c898-3ddf-0310-93e7-cc216c733640 --- src/command_groups.cc | 9 ++++++--- src/thread_base.cc | 14 ++++++++++---- src/thread_base.h | 5 +++++ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/command_groups.cc b/src/command_groups.cc index d1184343..8dfdd1f2 100644 --- a/src/command_groups.cc +++ b/src/command_groups.cc @@ -296,7 +296,8 @@ Number of unchoked upload / download peers regulated on a group basis. (choke_group.down.heuristics.set,,"heuristics") Heuristics used for deciding what peers to choke and unchoke, see -'strings.choke_heuristics' for a list of available options. +'strings.choke_heuristics{,_download,_upload}' for a list of available +options. */ @@ -304,8 +305,10 @@ Heuristics used for deciding what peers to choke and unchoke, see void initialize_command_groups() { // Move somewhere else? - CMD2_ANY ("strings.choke_heuristics", std::bind(&torrent::option_list_strings, torrent::OPTION_CHOKE_HEURISTICS)); - CMD2_ANY ("strings.tracker_mode", std::bind(&torrent::option_list_strings, torrent::OPTION_TRACKER_MODE)); + CMD2_ANY ("strings.choke_heuristics", std::bind(&torrent::option_list_strings, torrent::OPTION_CHOKE_HEURISTICS)); + CMD2_ANY ("strings.choke_heuristics.uplaod", std::bind(&torrent::option_list_strings, torrent::OPTION_CHOKE_HEURISTICS_UPLOAD)); + CMD2_ANY ("strings.choke_heuristics.downlaod", std::bind(&torrent::option_list_strings, torrent::OPTION_CHOKE_HEURISTICS_DOWNLOAD)); + CMD2_ANY ("strings.tracker_mode", std::bind(&torrent::option_list_strings, torrent::OPTION_TRACKER_MODE)); CMD2_ANY ("choke_group.list", std::bind(&apply_cg_list)); CMD2_ANY_STRING ("choke_group.insert", std::bind(&apply_cg_insert, std::placeholders::_2)); diff --git a/src/thread_base.cc b/src/thread_base.cc index 4a023770..5cfcf7d6 100644 --- a/src/thread_base.cc +++ b/src/thread_base.cc @@ -43,6 +43,7 @@ #include #include #include +#include #include #include @@ -201,10 +202,15 @@ ThreadBase::queue_item(thread_base_func newFunc) { void ThreadBase::interrupt_main_polling() { - do { + int sleep_length = 0; + + while (ThreadBase::is_main_polling()) { + pthread_kill(main_thread->m_thread, SIGUSR1); + if (!ThreadBase::is_main_polling()) return; - - pthread_kill(main_thread->m_thread, SIGUSR1); - } while (1); + + usleep(sleep_length); + sleep_length = std::min(sleep_length + 50, 1000); + } } diff --git a/src/thread_base.h b/src/thread_base.h index 04d5dfe6..1c250b81 100644 --- a/src/thread_base.h +++ b/src/thread_base.h @@ -84,6 +84,11 @@ public: static void* event_loop(ThreadBase* threadBase); + // Only call this when global lock has been acquired, as it checks + // ThreadBase::is_main_polling() which is only guaranteed to remain + // 'false' if global lock keeps main thread from entering polling + // again. + // // Move to libtorrent some day. static void interrupt_main_polling();