diff --git a/tdactor/CMakeLists.txt b/tdactor/CMakeLists.txt index c399319db..c0c83025e 100644 --- a/tdactor/CMakeLists.txt +++ b/tdactor/CMakeLists.txt @@ -42,6 +42,7 @@ set(TDACTOR_TEST_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/test/actors_main.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test/actors_simple.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test/actors_workers.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/test/actors_bugs.cpp PARENT_SCOPE ) diff --git a/tdactor/test/actors_bugs.cpp b/tdactor/test/actors_bugs.cpp new file mode 100644 index 000000000..05c8d865d --- /dev/null +++ b/tdactor/test/actors_bugs.cpp @@ -0,0 +1,49 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +#include "td/utils/tests.h" + +#include "td/actor/Timeout.h" + +using namespace td; + +TEST(MultiTimeout, bug) { + SET_VERBOSITY_LEVEL(VERBOSITY_NAME(DEBUG)); + + ConcurrentScheduler sched; + int threads_n = 0; + sched.init(threads_n); + + sched.start(); + std::unique_ptr multi_timeout; + struct Data { + MultiTimeout *multi_timeout; + }; + Data data; + + { + auto guard = sched.get_current_guard(); + multi_timeout = std::make_unique(); + data.multi_timeout = multi_timeout.get(); + multi_timeout->set_callback([](void *void_data, int64 key) { + auto &data = *reinterpret_cast(void_data); + if (key == 1) { + data.multi_timeout->cancel_timeout(key + 1); + data.multi_timeout->set_timeout_in(key + 2, 1); + } else { + Scheduler::instance()->finish(); + } + }); + multi_timeout->set_callback_data(&data); + multi_timeout->set_timeout_in(1, 1); + multi_timeout->set_timeout_in(2, 2); + } + + while (sched.run_main(10)) { + // empty + } + sched.finish(); +}