diff options
author | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2015-12-30 16:08:30 +0000 |
---|---|---|
committer | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2015-12-30 16:08:30 +0000 |
commit | 576effe11a513507b14275c7a2e6fc3b18de5e17 (patch) | |
tree | 1e3f666d1b6a5646543d258c2962d8ffe35b705f /src/cryptonote_core | |
parent | miner: minor fixes on stop (diff) | |
download | monero-576effe11a513507b14275c7a2e6fc3b18de5e17.tar.xz |
blockchain: kill ioservice on scope end, rather than manually
This ensures this will be done without fail, as the error prone
matching of every return with a call to KILL_IOSERVICE leads to
hard to debug corruption when one is missing.
Diffstat (limited to 'src/cryptonote_core')
-rw-r--r-- | src/cryptonote_core/blockchain.cpp | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/cryptonote_core/blockchain.cpp b/src/cryptonote_core/blockchain.cpp index 141a42f49..e4d3d57fc 100644 --- a/src/cryptonote_core/blockchain.cpp +++ b/src/cryptonote_core/blockchain.cpp @@ -2078,6 +2078,7 @@ bool Blockchain::check_tx_inputs(const transaction& tx, uint64_t* pmax_used_bloc boost::asio::io_service ioservice; boost::thread_group threadpool; + bool ioservice_active = false; std::unique_ptr < boost::asio::io_service::work > work(new boost::asio::io_service::work(ioservice)); if(threads > 1) @@ -2086,15 +2087,19 @@ bool Blockchain::check_tx_inputs(const transaction& tx, uint64_t* pmax_used_bloc { threadpool.create_thread(boost::bind(&boost::asio::io_service::run, &ioservice)); } + ioservice_active = true; } #define KILL_IOSERVICE() \ - if(threads > 1) \ + if(ioservice_active) \ { \ work.reset(); \ threadpool.join_all(); \ ioservice.stop(); \ - } \ + ioservice_active = false; \ + } + + epee::misc_utils::auto_scope_leave_caller ioservice_killer = epee::misc_utils::create_scope_leave_handler([&]() { KILL_IOSERVICE(); }); for (const auto& txin : tx.vin) { @@ -2109,7 +2114,6 @@ bool Blockchain::check_tx_inputs(const transaction& tx, uint64_t* pmax_used_bloc if(have_tx_keyimg_as_spent(in_to_key.k_image)) { LOG_PRINT_L1("Key image already spent in blockchain: " << epee::string_tools::pod_to_hex(in_to_key.k_image)); - KILL_IOSERVICE(); return false; } @@ -2123,7 +2127,6 @@ bool Blockchain::check_tx_inputs(const transaction& tx, uint64_t* pmax_used_bloc if(!itk->second) { LOG_PRINT_L1("Failed ring signature for tx " << get_transaction_hash(tx) << " vin key with k_image: " << in_to_key.k_image << " sig_index: " << sig_index); - KILL_IOSERVICE(); return false; } @@ -2145,7 +2148,6 @@ bool Blockchain::check_tx_inputs(const transaction& tx, uint64_t* pmax_used_bloc LOG_PRINT_L1(" *pmax_used_block_height: " << *pmax_used_block_height); } - KILL_IOSERVICE(); return false; } @@ -2168,7 +2170,6 @@ bool Blockchain::check_tx_inputs(const transaction& tx, uint64_t* pmax_used_bloc LOG_PRINT_L1("*pmax_used_block_height: " << *pmax_used_block_height); } - KILL_IOSERVICE(); return false; } it->second[in_to_key.k_image] = true; |