coro_signal2.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #define BOOST_TEST_DYN_LINK
  2. #define BOOST_TEST_MAIN // in only one cpp file
  3. #include "utility/coro_signal2.hpp"
  4. #include "core/sophiar_obj.hpp"
  5. #include "utility/debug_utility.hpp"
  6. #include <boost/asio/co_spawn.hpp>
  7. #include <boost/asio/detached.hpp>
  8. #include <boost/asio/this_coro.hpp>
  9. #include <boost/asio/use_awaitable.hpp>
  10. #include <boost/test/unit_test.hpp>
  11. #include <chrono>
  12. #include <iostream>
  13. #include <vector>
  14. using boost::asio::awaitable;
  15. using boost::asio::co_spawn;
  16. using boost::asio::detached;
  17. using boost::asio::use_awaitable;
  18. using namespace sophiar;
  19. using namespace std::chrono_literals;
  20. coro_signal2 sig_a{global_context}, sig_b{global_context};
  21. awaitable<void> coro_a() {
  22. auto watcher_b = sig_b.new_watcher(global_context);
  23. FILE_LINE_TRACE
  24. for (int i = 0; i < 1000; ++i) {
  25. sig_a.try_notify_all();
  26. co_await watcher_b.coro_wait();
  27. }
  28. FILE_LINE_TRACE
  29. sig_a.try_notify_all();
  30. co_return;
  31. }
  32. awaitable<void> coro_b() {
  33. co_await coro_sleep(10ms);
  34. auto watcher_a = sig_a.new_watcher(global_context);
  35. FILE_LINE_TRACE
  36. for (int i = 0; i < 1000; ++i) {
  37. sig_b.try_notify_all();
  38. co_await watcher_a.coro_wait();
  39. }
  40. FILE_LINE_TRACE
  41. sig_b.try_notify_all();
  42. co_return;
  43. }
  44. awaitable<void> coro_signal2_bench() {
  45. constexpr auto length = 100000;
  46. std::vector<std::unique_ptr<coro_signal2>> sig_pool;
  47. std::vector<signal_watcher> watcher_pool;
  48. for (int i = 0; i < length; ++i) {
  49. auto new_sig = std::make_unique<coro_signal2>(global_context);
  50. watcher_pool.push_back(new_sig->new_watcher(global_context));
  51. sig_pool.push_back(std::move(new_sig));
  52. }
  53. for (int i = 0; i < length - 1; ++i) {
  54. co_spawn(global_context, [&]() -> awaitable<void> {
  55. int index = i;
  56. co_await watcher_pool[index].coro_wait();
  57. sig_pool[index + 1]->try_notify_all();
  58. }, detached);
  59. }
  60. co_await coro_sleep(10ms);
  61. FILE_LINE_TRACE
  62. sig_pool[0]->try_notify_all();
  63. co_await watcher_pool[length - 1].coro_wait();
  64. FILE_LINE_TRACE
  65. co_return;
  66. }
  67. BOOST_AUTO_TEST_CASE(test_coro_signal2) {
  68. // co_spawn(global_context, coro_a(), detached);
  69. // co_spawn(global_context, coro_b(), detached);
  70. co_spawn(global_context, coro_signal2_bench(), detached);
  71. global_context.run();
  72. }