Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.11 KB | None | 0 0
  1. #include <boost/asio.hpp>
  2. #include <boost/asio/spawn.hpp>
  3. #include <iostream>
  4. #include <memory>
  5. #include <deque>
  6.  
  7. class Suspender
  8. {
  9.     private:
  10.         using handler_type  = boost::asio::handler_type<boost::asio::yield_context, void()>::type;
  11.         using result_type   = boost::asio::async_result<handler_type>;
  12.  
  13.         class HandlerWrapper
  14.         {
  15.             private:
  16.                 std::shared_ptr<handler_type>   _handler;
  17.             public:
  18.                 HandlerWrapper(boost::asio::yield_context yield) :
  19.                     _handler(std::make_shared<handler_type>(yield))
  20.                 {}
  21.  
  22.                 HandlerWrapper(const HandlerWrapper &that) = default;
  23.                 HandlerWrapper(HandlerWrapper &&that) = default;
  24.  
  25.                 void operator()()
  26.                 {
  27.                     return _handler->operator()();
  28.                 }
  29.  
  30.                 handler_type &operator*()
  31.                 {
  32.                     return *_handler;
  33.                 }
  34.         };
  35.  
  36.         std::deque<HandlerWrapper> _handlers;
  37.  
  38.     public:
  39.         Suspender() = default;
  40.  
  41.         void suspend(boost::asio::yield_context yield)
  42.         {
  43.             _handlers.emplace_back(yield);
  44.             result_type result{ *_handlers.back() };
  45.             result.get();
  46.         }
  47.  
  48.         void resume(boost::asio::io_service &service)
  49.         {
  50.             std::cout << "Resuming one of " << _handlers.size() << " waiting coroutines" << std::endl;
  51.  
  52.             if (_handlers.empty()) {
  53.                 return;
  54.             }
  55.  
  56.             service.post(_handlers.front());
  57.             _handlers.pop_front();
  58.         }
  59. };
  60.  
  61. int main()
  62. {
  63.     boost::asio::io_service service;
  64.     Suspender suspender;
  65.  
  66.     boost::asio::spawn(service, [&suspender](boost::asio::yield_context yield) {
  67.         std::cout << "Suspending" << std::endl;
  68.         suspender.suspend(yield);
  69.         std::cout << "Woke up" << std::endl;
  70.     });
  71.  
  72.     boost::asio::spawn(service, [&service, &suspender](boost::asio::yield_context yield) {
  73.         suspender.resume(service);
  74.     });
  75.  
  76.     service.run();
  77.  
  78.     return 0;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement