diff options
author | Determinant <[email protected]> | 2019-08-26 17:42:40 -0400 |
---|---|---|
committer | Determinant <[email protected]> | 2019-08-26 17:42:40 -0400 |
commit | e0de466e5758ce8ef6452e2a25614c2cb2844d91 (patch) | |
tree | 66ec037cedeb0b18d32a00f7e94edf6e2a7ce67b | |
parent | 1e2bceedc30e41964345acc8f0bdd734e766e1f6 (diff) |
fix data race
-rw-r--r-- | examples/hotstuff_app.cpp | 32 |
1 files changed, 8 insertions, 24 deletions
diff --git a/examples/hotstuff_app.cpp b/examples/hotstuff_app.cpp index 8bc092d..51baf26 100644 --- a/examples/hotstuff_app.cpp +++ b/examples/hotstuff_app.cpp @@ -83,7 +83,7 @@ class HotStuffApp: public HotStuff { std::unordered_map<const uint256_t, promise_t> unconfirmed; using conn_t = ClientNetwork<opcode_t>::conn_t; - using resp_queue_t = salticidae::MPSCQueueEventDriven<Finality>; + using resp_queue_t = salticidae::MPSCQueueEventDriven<std::pair<Finality, NetAddr>>; /* for the dedicated thread sending responses to the clients */ std::thread req_thread; @@ -110,7 +110,6 @@ class HotStuffApp: public HotStuff { #ifndef HOTSTUFF_ENABLE_BENCHMARK HOTSTUFF_LOG_INFO("replicated %s", std::string(fin).c_str()); #endif - resp_queue.enqueue(fin); } #ifdef HOTSTUFF_MSG_STAT @@ -312,14 +311,13 @@ HotStuffApp::HotStuffApp(uint32_t blk_size, resp_tcall = new salticidae::ThreadCall(resp_ec); req_tcall = new salticidae::ThreadCall(req_ec); resp_queue.reg_handler(resp_ec, [this](resp_queue_t &q) { - Finality fin; - while (q.try_dequeue(fin)) + std::pair<Finality, NetAddr> p; + while (q.try_dequeue(p)) { - auto it = unconfirmed.find(fin.cmd_hash); - if (it != unconfirmed.end()) - { - it->second.resolve(fin); - unconfirmed.erase(it); + try { + cn.send_msg(MsgRespCmd(std::move(p.first)), p.second); + } catch (std::exception &err) { + HOTSTUFF_LOG_WARN("unable to send to the client: %s", err.what()); } } return false; @@ -337,21 +335,7 @@ void HotStuffApp::client_request_cmd_handler(MsgReqCmd &&msg, const conn_t &conn const auto &cmd_hash = cmd->get_hash(); HOTSTUFF_LOG_DEBUG("processing %s", std::string(*cmd).c_str()); exec_command(cmd_hash, [this, addr](Finality fin) { - resp_queue.enqueue(fin); - }); - /* the following function is executed on the dedicated thread for confirming commands */ - resp_tcall->async_call([this, addr, cmd_hash](salticidae::ThreadCall::Handle &) { - auto it = unconfirmed.find(cmd_hash); - if (it == unconfirmed.end()) - it = unconfirmed.insert( - std::make_pair(cmd_hash, promise_t([](promise_t &){}))).first; - it->second.then([this, addr](const Finality &fin) { - try { - cn.send_msg(MsgRespCmd(std::move(fin)), addr); - } catch (std::exception &err) { - HOTSTUFF_LOG_WARN("unable to send to the client: %s", err.what()); - } - }); + resp_queue.enqueue(std::make_pair(fin, addr)); }); } |