From dff785667e08fe466443b517be0f2429b5fa2e78 Mon Sep 17 00:00:00 2001 From: Srdjan Obucina Date: Sun, 22 Mar 2020 21:07:21 +0100 Subject: [PATCH] Refactor on_changed_objects, move it into task --- .../sidechain_net_handler_bitcoin.hpp | 3 +++ .../sidechain_net_handler_bitcoin.cpp | 21 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_bitcoin.hpp b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_bitcoin.hpp index 2d3b5d43..637a5254 100644 --- a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_bitcoin.hpp +++ b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_bitcoin.hpp @@ -100,6 +100,8 @@ private: std::unique_ptr bitcoin_client; std::unique_ptr listener; + fc::future on_changed_objects_task; + std::string create_transaction(const std::vector &inputs, const fc::flat_map outputs); std::string sign_transaction(const std::string &tx, bool &complete); bool send_transaction(const std::string &tx); @@ -115,6 +117,7 @@ private: void handle_event(const std::string &event_data); std::vector extract_info_from_block(const std::string &_block); void on_changed_objects(const vector &ids, const flat_set &accounts); + void on_changed_objects_cb(const vector &ids, const flat_set &accounts); }; }} // namespace graphene::peerplays_sidechain diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp index eb17059a..86fc8134 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp @@ -795,6 +795,15 @@ sidechain_net_handler_bitcoin::sidechain_net_handler_bitcoin(peerplays_sidechain } sidechain_net_handler_bitcoin::~sidechain_net_handler_bitcoin() { + try { + if (on_changed_objects_task.valid()) { + on_changed_objects_task.cancel_and_wait(__FUNCTION__); + } + } catch (fc::canceled_exception &) { + //Expected exception. Move along. + } catch (fc::exception &e) { + edump((e.to_detail_string())); + } } void sidechain_net_handler_bitcoin::recreate_primary_wallet() { @@ -1350,6 +1359,18 @@ std::vector sidechain_net_handler_bitcoin::extract_info_from_block } void sidechain_net_handler_bitcoin::on_changed_objects(const vector &ids, const flat_set &accounts) { + fc::time_point now = fc::time_point::now(); + int64_t time_to_next_changed_objects_processing = 5000; + + fc::time_point next_wakeup(now + fc::microseconds(time_to_next_changed_objects_processing)); + + on_changed_objects_task = fc::schedule([this, ids, accounts] { + on_changed_objects_cb(ids, accounts); + }, + next_wakeup, "SON Processing"); +} + +void sidechain_net_handler_bitcoin::on_changed_objects_cb(const vector &ids, const flat_set &accounts) { for (auto id : ids) { if (id.is()) { const auto &swi = database.get_index_type().indices().get();