diff --git a/Jamfile b/Jamfile index 41090d318..edc1f7dba 100644 --- a/Jamfile +++ b/Jamfile @@ -421,7 +421,7 @@ feature.compose off : TORRENT_USE_IPV6=0 ; feature sanitize : off address undefined thread rtc : composite propagated link-incompatible ; # sanitize is a clang and GCC feature -feature.compose undefined : -fsanitize=undefined -fsanitize=undefined ; +feature.compose undefined : -fsanitize=undefined -fsanitize-undefined-trap-on-error -fsanitize=undefined ; feature.compose thread : -fsanitize=thread -fsanitize=thread ; feature.compose address : -fsanitize=address -fsanitize=address ; # RTC (runtime check) is an msvc feature diff --git a/include/libtorrent/alert_manager.hpp b/include/libtorrent/alert_manager.hpp index beac278fd..f308b8c2c 100644 --- a/include/libtorrent/alert_manager.hpp +++ b/include/libtorrent/alert_manager.hpp @@ -93,8 +93,8 @@ namespace libtorrent { // don't add more than this number of alerts, unless it's a // high priority alert, in which case we try harder to deliver it // for high priority alerts, double the upper limit - if (m_alerts[m_generation].size() >= m_queue_size_limit - * (1 + T::priority)) + if (m_alerts[m_generation].size() / (1 + T::priority) + >= m_queue_size_limit) return; T alert(m_allocations[m_generation], std::forward(args)...); @@ -118,8 +118,8 @@ namespace libtorrent { bool should_post() const { recursive_mutex::scoped_lock lock(m_mutex); - if (m_alerts[m_generation].size() >= m_queue_size_limit - * (1 + T::priority)) + if (m_alerts[m_generation].size() / (1 + T::priority) + >= m_queue_size_limit) { return false; } diff --git a/include/libtorrent/aux_/alert_manager_variadic_emplace.hpp b/include/libtorrent/aux_/alert_manager_variadic_emplace.hpp index 180632edd..3cca6181e 100644 --- a/include/libtorrent/aux_/alert_manager_variadic_emplace.hpp +++ b/include/libtorrent/aux_/alert_manager_variadic_emplace.hpp @@ -37,8 +37,8 @@ // don't add more than this number of alerts, unless it's a // high priority alert, in which case we try harder to deliver it // for high priority alerts, double the upper limit - if (m_alerts[m_generation].size() >= m_queue_size_limit - * (1 + T::priority)) + if (m_alerts[m_generation].size() / (1 + T::priority) + >= m_queue_size_limit) return; T alert(m_allocations[m_generation] diff --git a/test/test_alert_manager.cpp b/test/test_alert_manager.cpp index a1de83797..fbb2c5ecc 100644 --- a/test/test_alert_manager.cpp +++ b/test/test_alert_manager.cpp @@ -81,6 +81,26 @@ TORRENT_TEST(limit) TEST_EQUAL(alerts.size(), 200); } +TORRENT_TEST(limit_int_max) +{ + int const inf = std::numeric_limits::max(); + alert_manager mgr(inf, 0xffffffff); + + TEST_EQUAL(mgr.alert_queue_size_limit(), inf); + + for (int i = 0; i < 600; ++i) + mgr.emplace_alert(torrent_handle(), i); + + for (int i = 0; i < 600; ++i) + mgr.emplace_alert(torrent_handle(), sha1_hash()); + + std::vector alerts; + int num_resume; + mgr.get_all(alerts, num_resume); + + TEST_EQUAL(alerts.size(), 1200); +} + TORRENT_TEST(priority_limit) { alert_manager mgr(100, 0xffffffff);