From e888a66458d9ec9d0e41d3cc6b2a4f6b813e35d6 Mon Sep 17 00:00:00 2001 From: clemahieu Date: Mon, 2 Apr 2018 12:25:24 -0500 Subject: [PATCH] Running recalculate_stake process and holding reference to node by weak_ptr inside alarm instead of by shared_ptr to prevent circular references and hangs during shutdown. --- rai/node/node.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/rai/node/node.cpp b/rai/node/node.cpp index 955cbd1a..74833010 100644 --- a/rai/node/node.cpp +++ b/rai/node/node.cpp @@ -1927,6 +1927,7 @@ void rai::node::start () bootstrap.start (); backup_wallet (); active.announce_votes (); + online_reps.recalculate_stake (); port_mapping.start (); add_initial_peers (); observers.started (); @@ -2496,8 +2497,13 @@ void rai::online_reps::recalculate_stake () online_stake_total += node.ledger.weight (transaction, it.representative); } auto now (std::chrono::steady_clock::now ()); - auto node_l (node.shared ()); - node.alarm.add (now + std::chrono::minutes (5), [node_l]() { node_l->online_reps.recalculate_stake (); }); + std::weak_ptr node_w (node.shared ()); + node.alarm.add (now + std::chrono::minutes (5), [node_w]() { + if (auto node_l = node_w.lock ()) + { + node_l->online_reps.recalculate_stake (); + } + }); } rai::uint128_t rai::online_reps::online_stake ()