File: sync_connection.hpp

package info (click to toggle)
boost1.90 1.90.0-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 593,120 kB
  • sloc: cpp: 4,190,908; xml: 196,648; python: 34,618; ansic: 23,145; asm: 5,468; sh: 3,774; makefile: 1,161; perl: 1,020; sql: 728; ruby: 676; yacc: 478; java: 77; lisp: 24; csh: 6
file content (63 lines) | stat: -rw-r--r-- 1,426 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

/* Copyright (c) 2018-2024 Marcelo Zimbres Silva (mzimbres@gmail.com)
 *
 * Distributed under the Boost Software License, Version 1.0. (See
 * accompanying file LICENSE.txt)
 */

#include <boost/redis/connection.hpp>
#include <boost/redis/request.hpp>

#include <boost/asio/deferred.hpp>
#include <boost/asio/detached.hpp>
#include <boost/asio/use_future.hpp>

#include <chrono>
#include <thread>

using namespace std::chrono_literals;

namespace boost::redis {

class sync_connection {
public:
   sync_connection()
   : ioc_{1}
   , conn_{std::make_shared<connection>(ioc_)}
   { }

   ~sync_connection() { thread_.join(); }

   void run(config cfg)
   {
      // Starts a thread that will can io_context::run on which the
      // connection will run.
      thread_ = std::thread{[this, cfg]() {
         conn_->async_run(cfg, asio::detached);
         ioc_.run();
      }};
   }

   void stop()
   {
      asio::dispatch(ioc_, [this]() {
         conn_->cancel();
      });
   }

   template <class Response>
   auto exec(request const& req, Response& resp)
   {
      asio::dispatch(conn_->get_executor(), asio::deferred([this, &req, &resp]() {
                        return conn_->async_exec(req, resp, asio::deferred);
                     }))(asio::use_future)
         .get();
   }

private:
   asio::io_context ioc_{1};
   std::shared_ptr<connection> conn_;
   std::thread thread_;
};

}  // namespace boost::redis