mirror of
https://github.com/dashpay/dash.git
synced 2024-12-27 21:12:48 +01:00
[wallet] Make CWallet::ListCoins atomic
This commit is contained in:
parent
4cad91663d
commit
1beea7af92
@ -676,18 +676,24 @@ BOOST_FIXTURE_TEST_CASE(ListCoins, ListCoinsTestingSetup)
|
|||||||
BOOST_CHECK_EQUAL(list.begin()->second.size(), 2);
|
BOOST_CHECK_EQUAL(list.begin()->second.size(), 2);
|
||||||
|
|
||||||
// Lock both coins. Confirm number of available coins drops to 0.
|
// Lock both coins. Confirm number of available coins drops to 0.
|
||||||
|
{
|
||||||
|
LOCK2(cs_main, wallet->cs_wallet);
|
||||||
std::vector<COutput> available;
|
std::vector<COutput> available;
|
||||||
wallet->AvailableCoins(available);
|
wallet->AvailableCoins(available);
|
||||||
BOOST_CHECK_EQUAL(available.size(), 2);
|
BOOST_CHECK_EQUAL(available.size(), 2);
|
||||||
|
}
|
||||||
for (const auto& group : list) {
|
for (const auto& group : list) {
|
||||||
for (const auto& coin : group.second) {
|
for (const auto& coin : group.second) {
|
||||||
LOCK(wallet->cs_wallet);
|
LOCK(wallet->cs_wallet);
|
||||||
wallet->LockCoin(COutPoint(coin.tx->GetHash(), coin.i));
|
wallet->LockCoin(COutPoint(coin.tx->GetHash(), coin.i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
LOCK2(cs_main, wallet->cs_wallet);
|
||||||
|
std::vector<COutput> available;
|
||||||
wallet->AvailableCoins(available);
|
wallet->AvailableCoins(available);
|
||||||
BOOST_CHECK_EQUAL(available.size(), 0);
|
BOOST_CHECK_EQUAL(available.size(), 0);
|
||||||
|
}
|
||||||
// Confirm ListCoins still returns same result as before, despite coins
|
// Confirm ListCoins still returns same result as before, despite coins
|
||||||
// being locked.
|
// being locked.
|
||||||
list = wallet->ListCoins();
|
list = wallet->ListCoins();
|
||||||
|
@ -2198,11 +2198,12 @@ CAmount CWallet::GetAvailableBalance(const CCoinControl* coinControl) const
|
|||||||
|
|
||||||
void CWallet::AvailableCoins(std::vector<COutput> &vCoins, bool fOnlySafe, const CCoinControl *coinControl, const CAmount &nMinimumAmount, const CAmount &nMaximumAmount, const CAmount &nMinimumSumAmount, const uint64_t nMaximumCount, const int nMinDepth, const int nMaxDepth) const
|
void CWallet::AvailableCoins(std::vector<COutput> &vCoins, bool fOnlySafe, const CCoinControl *coinControl, const CAmount &nMinimumAmount, const CAmount &nMaximumAmount, const CAmount &nMinimumSumAmount, const uint64_t nMaximumCount, const int nMinDepth, const int nMaxDepth) const
|
||||||
{
|
{
|
||||||
|
AssertLockHeld(cs_main);
|
||||||
|
AssertLockHeld(cs_wallet);
|
||||||
|
|
||||||
vCoins.clear();
|
vCoins.clear();
|
||||||
|
|
||||||
{
|
{
|
||||||
LOCK2(cs_main, cs_wallet);
|
|
||||||
|
|
||||||
CAmount nTotal = 0;
|
CAmount nTotal = 0;
|
||||||
|
|
||||||
for (const auto& entry : mapWallet)
|
for (const auto& entry : mapWallet)
|
||||||
@ -2320,11 +2321,11 @@ std::map<CTxDestination, std::vector<COutput>> CWallet::ListCoins() const
|
|||||||
// avoid adding some extra complexity to the Qt code.
|
// avoid adding some extra complexity to the Qt code.
|
||||||
|
|
||||||
std::map<CTxDestination, std::vector<COutput>> result;
|
std::map<CTxDestination, std::vector<COutput>> result;
|
||||||
|
|
||||||
std::vector<COutput> availableCoins;
|
std::vector<COutput> availableCoins;
|
||||||
AvailableCoins(availableCoins);
|
|
||||||
|
|
||||||
LOCK2(cs_main, cs_wallet);
|
LOCK2(cs_main, cs_wallet);
|
||||||
|
AvailableCoins(availableCoins);
|
||||||
|
|
||||||
for (auto& coin : availableCoins) {
|
for (auto& coin : availableCoins) {
|
||||||
CTxDestination address;
|
CTxDestination address;
|
||||||
if (coin.fSpendable &&
|
if (coin.fSpendable &&
|
||||||
|
Loading…
Reference in New Issue
Block a user