|
|
|
@ -1949,7 +1949,7 @@ void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote
|
|
|
|
|
int num_vouts_received = 0;
|
|
|
|
|
tx_pub_key = pub_key_field.pub_key;
|
|
|
|
|
tools::threadpool& tpool = tools::threadpool::getInstance();
|
|
|
|
|
tools::threadpool::waiter waiter;
|
|
|
|
|
tools::threadpool::waiter waiter(tpool);
|
|
|
|
|
const cryptonote::account_keys& keys = m_account.get_keys();
|
|
|
|
|
crypto::key_derivation derivation;
|
|
|
|
|
|
|
|
|
@ -2022,7 +2022,7 @@ void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote
|
|
|
|
|
tpool.submit(&waiter, boost::bind(&wallet2::check_acc_out_precomp_once, this, std::cref(tx.vout[i]), std::cref(derivation), std::cref(additional_derivations), i,
|
|
|
|
|
std::cref(is_out_data_ptr), std::ref(tx_scan_info[i]), std::ref(output_found[i])), true);
|
|
|
|
|
}
|
|
|
|
|
waiter.wait(&tpool);
|
|
|
|
|
THROW_WALLET_EXCEPTION_IF(!waiter.wait(), error::wallet_internal_error, "Exception in thread pool");
|
|
|
|
|
// then scan all outputs from 0
|
|
|
|
|
hw::device &hwdev = m_account.get_device();
|
|
|
|
|
boost::unique_lock<hw::device> hwdev_lock (hwdev);
|
|
|
|
@ -2049,7 +2049,7 @@ void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote
|
|
|
|
|
tpool.submit(&waiter, boost::bind(&wallet2::check_acc_out_precomp_once, this, std::cref(tx.vout[i]), std::cref(derivation), std::cref(additional_derivations), i,
|
|
|
|
|
std::cref(is_out_data_ptr), std::ref(tx_scan_info[i]), std::ref(output_found[i])), true);
|
|
|
|
|
}
|
|
|
|
|
waiter.wait(&tpool);
|
|
|
|
|
THROW_WALLET_EXCEPTION_IF(!waiter.wait(), error::wallet_internal_error, "Exception in thread pool");
|
|
|
|
|
|
|
|
|
|
hw::device &hwdev = m_account.get_device();
|
|
|
|
|
boost::unique_lock<hw::device> hwdev_lock (hwdev);
|
|
|
|
@ -2687,7 +2687,7 @@ void wallet2::process_parsed_blocks(uint64_t start_height, const std::vector<cry
|
|
|
|
|
THROW_WALLET_EXCEPTION_IF(!m_blockchain.is_in_bounds(current_index), error::out_of_hashchain_bounds_error);
|
|
|
|
|
|
|
|
|
|
tools::threadpool& tpool = tools::threadpool::getInstance();
|
|
|
|
|
tools::threadpool::waiter waiter;
|
|
|
|
|
tools::threadpool::waiter waiter(tpool);
|
|
|
|
|
|
|
|
|
|
size_t num_txes = 0;
|
|
|
|
|
std::vector<tx_cache_data> tx_cache_data;
|
|
|
|
@ -2714,7 +2714,7 @@ void wallet2::process_parsed_blocks(uint64_t start_height, const std::vector<cry
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
THROW_WALLET_EXCEPTION_IF(txidx != num_txes, error::wallet_internal_error, "txidx does not match tx_cache_data size");
|
|
|
|
|
waiter.wait(&tpool);
|
|
|
|
|
THROW_WALLET_EXCEPTION_IF(!waiter.wait(), error::wallet_internal_error, "Exception in thread pool");
|
|
|
|
|
|
|
|
|
|
hw::device &hwdev = m_account.get_device();
|
|
|
|
|
hw::reset_mode rst(hwdev);
|
|
|
|
@ -2743,7 +2743,7 @@ void wallet2::process_parsed_blocks(uint64_t start_height, const std::vector<cry
|
|
|
|
|
gender(iod);
|
|
|
|
|
}, true);
|
|
|
|
|
}
|
|
|
|
|
waiter.wait(&tpool);
|
|
|
|
|
THROW_WALLET_EXCEPTION_IF(!waiter.wait(), error::wallet_internal_error, "Exception in thread pool");
|
|
|
|
|
|
|
|
|
|
auto geniod = [&](const cryptonote::transaction &tx, size_t n_vouts, size_t txidx) {
|
|
|
|
|
for (size_t k = 0; k < n_vouts; ++k)
|
|
|
|
@ -2791,7 +2791,7 @@ void wallet2::process_parsed_blocks(uint64_t start_height, const std::vector<cry
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
THROW_WALLET_EXCEPTION_IF(txidx != tx_cache_data.size(), error::wallet_internal_error, "txidx did not reach expected value");
|
|
|
|
|
waiter.wait(&tpool);
|
|
|
|
|
THROW_WALLET_EXCEPTION_IF(!waiter.wait(), error::wallet_internal_error, "Exception in thread pool");
|
|
|
|
|
hwdev.set_mode(hw::device::NONE);
|
|
|
|
|
|
|
|
|
|
size_t tx_cache_data_offset = 0;
|
|
|
|
@ -2863,14 +2863,14 @@ void wallet2::pull_and_parse_next_blocks(uint64_t start_height, uint64_t &blocks
|
|
|
|
|
THROW_WALLET_EXCEPTION_IF(blocks.size() != o_indices.size(), error::wallet_internal_error, "Mismatched sizes of blocks and o_indices");
|
|
|
|
|
|
|
|
|
|
tools::threadpool& tpool = tools::threadpool::getInstance();
|
|
|
|
|
tools::threadpool::waiter waiter;
|
|
|
|
|
tools::threadpool::waiter waiter(tpool);
|
|
|
|
|
parsed_blocks.resize(blocks.size());
|
|
|
|
|
for (size_t i = 0; i < blocks.size(); ++i)
|
|
|
|
|
{
|
|
|
|
|
tpool.submit(&waiter, boost::bind(&wallet2::parse_block_round, this, std::cref(blocks[i].block),
|
|
|
|
|
std::ref(parsed_blocks[i].block), std::ref(parsed_blocks[i].hash), std::ref(parsed_blocks[i].error)), true);
|
|
|
|
|
}
|
|
|
|
|
waiter.wait(&tpool);
|
|
|
|
|
THROW_WALLET_EXCEPTION_IF(!waiter.wait(), error::wallet_internal_error, "Exception in thread pool");
|
|
|
|
|
for (size_t i = 0; i < blocks.size(); ++i)
|
|
|
|
|
{
|
|
|
|
|
if (parsed_blocks[i].error)
|
|
|
|
@ -2896,7 +2896,7 @@ void wallet2::pull_and_parse_next_blocks(uint64_t start_height, uint64_t &blocks
|
|
|
|
|
}, true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
waiter.wait(&tpool);
|
|
|
|
|
THROW_WALLET_EXCEPTION_IF(!waiter.wait(), error::wallet_internal_error, "Exception in thread pool");
|
|
|
|
|
last = !blocks.empty() && cryptonote::get_block_height(parsed_blocks.back().block) + 1 == current_height;
|
|
|
|
|
}
|
|
|
|
|
catch(...)
|
|
|
|
@ -3338,7 +3338,7 @@ void wallet2::refresh(bool trusted_daemon, uint64_t start_height, uint64_t & blo
|
|
|
|
|
crypto::hash last_tx_hash_id = m_transfers.size() ? m_transfers.back().m_txid : null_hash;
|
|
|
|
|
std::list<crypto::hash> short_chain_history;
|
|
|
|
|
tools::threadpool& tpool = tools::threadpool::getInstance();
|
|
|
|
|
tools::threadpool::waiter waiter;
|
|
|
|
|
tools::threadpool::waiter waiter(tpool);
|
|
|
|
|
uint64_t blocks_start_height;
|
|
|
|
|
std::vector<cryptonote::block_complete_entry> blocks;
|
|
|
|
|
std::vector<parsed_block> parsed_blocks;
|
|
|
|
@ -3446,7 +3446,7 @@ void wallet2::refresh(bool trusted_daemon, uint64_t start_height, uint64_t & blo
|
|
|
|
|
}
|
|
|
|
|
blocks_fetched += added_blocks;
|
|
|
|
|
}
|
|
|
|
|
waiter.wait(&tpool);
|
|
|
|
|
THROW_WALLET_EXCEPTION_IF(!waiter.wait(), error::wallet_internal_error, "Exception in thread pool");
|
|
|
|
|
if(!first && blocks_start_height == next_blocks_start_height)
|
|
|
|
|
{
|
|
|
|
|
m_node_rpc_proxy.set_height(m_blockchain.size());
|
|
|
|
@ -3478,19 +3478,19 @@ void wallet2::refresh(bool trusted_daemon, uint64_t start_height, uint64_t & blo
|
|
|
|
|
catch (const tools::error::password_needed&)
|
|
|
|
|
{
|
|
|
|
|
blocks_fetched += added_blocks;
|
|
|
|
|
waiter.wait(&tpool);
|
|
|
|
|
THROW_WALLET_EXCEPTION_IF(!waiter.wait(), error::wallet_internal_error, "Exception in thread pool");
|
|
|
|
|
throw;
|
|
|
|
|
}
|
|
|
|
|
catch (const error::payment_required&)
|
|
|
|
|
{
|
|
|
|
|
// no point in trying again, it'd just eat up credits
|
|
|
|
|
waiter.wait(&tpool);
|
|
|
|
|
THROW_WALLET_EXCEPTION_IF(!waiter.wait(), error::wallet_internal_error, "Exception in thread pool");
|
|
|
|
|
throw;
|
|
|
|
|
}
|
|
|
|
|
catch (const std::exception&)
|
|
|
|
|
{
|
|
|
|
|
blocks_fetched += added_blocks;
|
|
|
|
|
waiter.wait(&tpool);
|
|
|
|
|
THROW_WALLET_EXCEPTION_IF(!waiter.wait(), error::wallet_internal_error, "Exception in thread pool");
|
|
|
|
|
if(try_count < 3)
|
|
|
|
|
{
|
|
|
|
|
LOG_PRINT_L1("Another try pull_blocks (try_count=" << try_count << ")...");
|
|
|
|
|