coro_unique_lock.cpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #define BOOST_TEST_DYN_LINK
  2. #include "core/sophiar_obj.hpp"
  3. #include "utility/coro_unique_lock.hpp"
  4. #include "utility/debug_utility.hpp"
  5. #include <boost/asio/co_spawn.hpp>
  6. #include <boost/asio/detached.hpp>
  7. #include <boost/asio/this_coro.hpp>
  8. #include <boost/asio/use_awaitable.hpp>
  9. #include <boost/test/unit_test.hpp>
  10. #include <chrono>
  11. #include <iostream>
  12. #include <vector>
  13. using boost::asio::awaitable;
  14. using boost::asio::co_spawn;
  15. using boost::asio::detached;
  16. using boost::asio::use_awaitable;
  17. using namespace sophiar;
  18. using namespace std::chrono_literals;
  19. coro_unique_lock *lock;
  20. awaitable<void> unlocked_worker(int id) {
  21. DEBUG_PRINT(fmt::format("Worker {} starts to work.", id));
  22. co_await coro_sleep(1s);
  23. DEBUG_PRINT(fmt::format("Worker {} finished work.", id));
  24. }
  25. awaitable<void> locked_worker(int id) {
  26. auto lock_guard = coro_lock_guard{*lock};
  27. co_await lock_guard.coro_require_lock();
  28. DEBUG_PRINT(fmt::format("Worker {} starts to work.", id));
  29. co_await coro_sleep(1s);
  30. DEBUG_PRINT(fmt::format("Worker {} finished work.", id));
  31. }
  32. BOOST_AUTO_TEST_CASE(test_coro_unique_lock) {
  33. initialize({});
  34. lock = new coro_unique_lock{};
  35. for (int i = 0; i < 5; ++i) {
  36. co_spawn(*global_context, locked_worker(i), detached);
  37. }
  38. global_context->run();
  39. }