OpenCBDC Transaction Processor
Loading...
Searching...
No Matches
uhs/atomizer/sentinel/server.cpp
Go to the documentation of this file.
1// Copyright (c) 2021 MIT Digital Currency Initiative,
2// Federal Reserve Bank of Boston
3// Distributed under the MIT software license, see the accompanying
4// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6#include "server.hpp"
7
10 interface* impl,
12 : m_impl(impl),
13 m_srv(std::move(srv)) {
14 m_srv->register_handler_callback(
15 [&](request req, callback_type callback) -> bool {
16 m_queue.push({std::move(req), std::move(callback)});
17 return true;
18 });
19
20 auto n_threads = std::thread::hardware_concurrency();
21 for(size_t i = 0; i < n_threads; i++) {
22 m_threads.emplace_back([&]() {
23 while(handle_request()) {}
24 });
25 }
26 }
27
29 m_queue.clear();
30 for(auto& t : m_threads) {
31 if(t.joinable()) {
32 t.join();
33 }
34 }
35 }
36
37 auto server::handle_request() -> bool {
38 auto req = request_type();
39 auto popped = m_queue.pop(req);
40 if(!popped) {
41 return false;
42 }
43
44 auto res = std::visit(
46 [&](execute_request e_req) -> std::optional<response> {
47 return m_impl->execute_transaction(std::move(e_req));
48 },
49 [&](validate_request v_req) -> std::optional<response> {
50 return m_impl->validate_transaction(std::move(v_req));
51 }},
52 req.first);
53
54 req.second(res);
55
56 return true;
57 }
58}
Generic asynchronous RPC server.
Interface for a sentinel.
server(interface *impl, std::unique_ptr< cbdc::rpc::async_server< request, response > > srv)
Constructor.
std::variant< execute_request, validate_request > request
Sentinel RPC request type.
Variant handler template.