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();