coro_signal2.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #define BOOST_TEST_DYN_LINK
  2. #define BOOST_TEST_MAIN // in only one cpp file
  3. #include "core/sophiar_obj.hpp"
  4. #include "utility/coro_signal2.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, *sig_b;
  21. awaitable<void> coro_a() {
  22. auto watcher_b = sig_b->new_watcher();
  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();
  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>();
  50. watcher_pool.push_back(new_sig->new_watcher());
  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. initialize({});
  69. sig_a = new coro_signal2{};
  70. sig_b = new coro_signal2{};
  71. // co_spawn(*global_context, coro_a(), detached);
  72. // co_spawn(*global_context, coro_b(), detached);
  73. co_spawn(*global_context, coro_signal2_bench(), detached);
  74. global_context->run();
  75. }