From b5794730b5cfba58be0aa63070718cde662bb538 Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Wed, 27 Nov 2019 23:41:30 +0200 Subject: [core] Introduce Scheduler::GetSequenced() API The newly introduced `Scheduler::GetSequenced()` returns sequenced schedulers from the cache limited to 10 instances, preventing from spawning too many threads. --- test/util/async_task.test.cpp | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'test') diff --git a/test/util/async_task.test.cpp b/test/util/async_task.test.cpp index 214e490fd8..8c79c51405 100644 --- a/test/util/async_task.test.cpp +++ b/test/util/async_task.test.cpp @@ -169,4 +169,47 @@ TEST(AsyncTask, scheduleAndReplyValue) { auto sheduler = Scheduler::GetBackground(); sheduler->scheduleAndReplyValue(runInBackground, onResult); loop.run(); +} + +TEST(AsyncTask, SequencedScheduler) { + RunLoop loop; + std::thread::id caller_id = std::this_thread::get_id(); + std::thread::id bg_id; + int count = 0; + + auto first = [caller_id, &bg_id, &count]() { + EXPECT_EQ(0, count); + bg_id = std::this_thread::get_id(); + EXPECT_NE(caller_id, bg_id); + count++; + }; + auto second = [&bg_id, &count]() { + EXPECT_EQ(1, count); + EXPECT_EQ(bg_id, std::this_thread::get_id()); + count++; + }; + auto third = [&bg_id, &count, &loop]() { + EXPECT_EQ(2, count); + EXPECT_EQ(bg_id, std::this_thread::get_id()); + loop.stop(); + }; + + auto sheduler = Scheduler::GetSequenced(); + + sheduler->schedule(first); + sheduler->schedule(second); + sheduler->schedule(third); + loop.run(); +} + +TEST(AsyncTask, MultipleSequencedSchedulers) { + std::vector> shedulers; + + for (int i = 0; i < 10; ++i) { + auto scheduler = Scheduler::GetSequenced(); + EXPECT_TRUE(std::none_of( + shedulers.begin(), shedulers.end(), [&scheduler](const auto &item) { return item == scheduler; })); + shedulers.emplace_back(std::move(scheduler)); + } + EXPECT_EQ(shedulers.front(), Scheduler::GetSequenced()); } \ No newline at end of file -- cgit v1.2.1