@@ -96,11 +96,9 @@ PeerMsgRet CCoinJoinClientQueueManager::ProcessDSQueue(const CNode& peer, CDataS
96
96
}
97
97
98
98
// if the queue is ready, submit if we can
99
- if (dsq.fReady && ranges::any_of (m_walletman.raw (),
100
- [this , &dmn](const auto &pair) {
101
- return pair.second ->TrySubmitDenominate (dmn->pdmnState ->addr ,
102
- this ->connman );
103
- })) {
99
+ if (dsq.fReady && m_walletman.ForAnyCJClientMan ([this , &dmn](std::unique_ptr<CCoinJoinClientManager>& clientman) {
100
+ return clientman->TrySubmitDenominate (dmn->pdmnState ->addr , this ->connman );
101
+ })) {
104
102
LogPrint (BCLog::COINJOIN, " DSQUEUE -- CoinJoin queue (%s) is ready on masternode %s\n " , dsq.ToString (),
105
103
dmn->pdmnState ->addr .ToString ());
106
104
return {};
@@ -121,8 +119,9 @@ PeerMsgRet CCoinJoinClientQueueManager::ProcessDSQueue(const CNode& peer, CDataS
121
119
LogPrint (BCLog::COINJOIN, " DSQUEUE -- new CoinJoin queue (%s) from masternode %s\n " , dsq.ToString (),
122
120
dmn->pdmnState ->addr .ToString ());
123
121
124
- ranges::any_of (m_walletman.raw (),
125
- [&dsq](const auto &pair) { return pair.second ->MarkAlreadyJoinedQueueAsTried (dsq); });
122
+ m_walletman.ForAnyCJClientMan ([&dsq](const std::unique_ptr<CCoinJoinClientManager>& clientman) {
123
+ return clientman->MarkAlreadyJoinedQueueAsTried (dsq);
124
+ });
126
125
127
126
WITH_LOCK (cs_vecqueue, vecCoinJoinQueue.push_back (dsq));
128
127
}
@@ -155,11 +154,14 @@ void CCoinJoinClientManager::ProcessMessage(CNode& peer, CChainState& active_cha
155
154
}
156
155
}
157
156
158
- CCoinJoinClientSession::CCoinJoinClientSession (CWallet& wallet, CoinJoinWalletManager& walletman, CDeterministicMNManager& dmnman, CMasternodeMetaMan& mn_metaman,
159
- const CMasternodeSync& mn_sync, const std::unique_ptr<CCoinJoinClientQueueManager>& queueman, bool is_masternode) :
157
+ CCoinJoinClientSession::CCoinJoinClientSession (CWallet& wallet, CoinJoinWalletManager& walletman,
158
+ CCoinJoinClientManager& clientman, CDeterministicMNManager& dmnman,
159
+ CMasternodeMetaMan& mn_metaman, const CMasternodeSync& mn_sync,
160
+ const std::unique_ptr<CCoinJoinClientQueueManager>& queueman,
161
+ bool is_masternode) :
160
162
m_wallet(wallet),
161
163
m_walletman(walletman),
162
- m_manager(* Assert (walletman.Get(wallet.GetName())) ),
164
+ m_clientman(clientman ),
163
165
m_dmnman(dmnman),
164
166
m_mn_metaman(mn_metaman),
165
167
m_mn_sync(mn_sync),
@@ -684,7 +686,7 @@ void CCoinJoinClientSession::CompletedTransaction(PoolMessage nMessageID)
684
686
if (m_is_masternode) return ;
685
687
686
688
if (nMessageID == MSG_SUCCESS) {
687
- m_manager .UpdatedSuccessBlock ();
689
+ m_clientman .UpdatedSuccessBlock ();
688
690
keyHolderStorage.KeepAll ();
689
691
WalletCJLogPrint (m_wallet, " CompletedTransaction -- success\n " );
690
692
} else {
@@ -995,7 +997,8 @@ bool CCoinJoinClientManager::DoAutomaticDenominating(CChainState& active_chainst
995
997
AssertLockNotHeld (cs_deqsessions);
996
998
LOCK (cs_deqsessions);
997
999
if (int (deqSessions.size ()) < CCoinJoinClientOptions::GetSessions ()) {
998
- deqSessions.emplace_back (m_wallet, m_walletman, m_dmnman, m_mn_metaman, m_mn_sync, m_queueman, m_is_masternode);
1000
+ deqSessions.emplace_back (m_wallet, m_walletman, *this , m_dmnman, m_mn_metaman, m_mn_sync, m_queueman,
1001
+ m_is_masternode);
999
1002
}
1000
1003
for (auto & session : deqSessions) {
1001
1004
if (!CheckAutomaticBackup ()) return false ;
@@ -1100,7 +1103,7 @@ bool CCoinJoinClientSession::JoinExistingQueue(CAmount nBalanceNeedsAnonymized,
1100
1103
continue ;
1101
1104
}
1102
1105
1103
- m_manager .AddUsedMasternode (dsq.masternodeOutpoint );
1106
+ m_clientman .AddUsedMasternode (dsq.masternodeOutpoint );
1104
1107
1105
1108
if (connman.IsMasternodeOrDisconnectRequested (dmn->pdmnState ->addr )) {
1106
1109
WalletCJLogPrint (m_wallet, " CCoinJoinClientSession::JoinExistingQueue -- skipping masternode connection, addr=%s\n " , dmn->pdmnState ->addr .ToString ());
@@ -1145,14 +1148,14 @@ bool CCoinJoinClientSession::StartNewQueue(CAmount nBalanceNeedsAnonymized, CCon
1145
1148
1146
1149
// otherwise, try one randomly
1147
1150
while (nTries < 10 ) {
1148
- auto dmn = m_manager .GetRandomNotUsedMasternode ();
1151
+ auto dmn = m_clientman .GetRandomNotUsedMasternode ();
1149
1152
if (!dmn) {
1150
1153
strAutoDenomResult = _ (" Can't find random Masternode." );
1151
1154
WalletCJLogPrint (m_wallet, " CCoinJoinClientSession::StartNewQueue -- %s\n " , strAutoDenomResult.original );
1152
1155
return false ;
1153
1156
}
1154
1157
1155
- m_manager .AddUsedMasternode (dmn->collateralOutpoint );
1158
+ m_clientman .AddUsedMasternode (dmn->collateralOutpoint );
1156
1159
1157
1160
// skip next mn payments winners
1158
1161
if (dmn->pdmnState ->nLastPaidHeight + nWeightedMnCount < mnList.GetHeight () + WinnersToSkip ()) {
@@ -1526,7 +1529,7 @@ bool CCoinJoinClientSession::MakeCollateralAmounts(const CompactTallyItem& tally
1526
1529
return false ;
1527
1530
}
1528
1531
1529
- m_manager .UpdatedSuccessBlock ();
1532
+ m_clientman .UpdatedSuccessBlock ();
1530
1533
1531
1534
WalletCJLogPrint (m_wallet, " CCoinJoinClientSession::%s -- txid: %s\n " , __func__, strResult.original );
1532
1535
@@ -1803,7 +1806,7 @@ bool CCoinJoinClientSession::CreateDenominated(CAmount nBalanceToDenominate, con
1803
1806
}
1804
1807
1805
1808
// use the same nCachedLastSuccessBlock as for DS mixing to prevent race
1806
- m_manager .UpdatedSuccessBlock ();
1809
+ m_clientman .UpdatedSuccessBlock ();
1807
1810
1808
1811
WalletCJLogPrint (m_wallet, " CCoinJoinClientSession::%s -- txid: %s\n " , __func__, strResult.original );
1809
1812
@@ -1894,35 +1897,43 @@ void CCoinJoinClientManager::GetJsonInfo(UniValue& obj) const
1894
1897
obj.pushKV (" sessions" , arrSessions);
1895
1898
}
1896
1899
1897
- void CoinJoinWalletManager::Add (CWallet& wallet) {
1898
- m_wallet_manager_map.try_emplace (
1899
- wallet.GetName (),
1900
- std::make_unique<CCoinJoinClientManager>(wallet, *this , m_dmnman, m_mn_metaman, m_mn_sync, m_queueman, m_is_masternode)
1901
- );
1900
+ void CoinJoinWalletManager::Add (CWallet& wallet)
1901
+ {
1902
+ {
1903
+ LOCK (cs_wallet_manager_map);
1904
+ m_wallet_manager_map.try_emplace (wallet.GetName (),
1905
+ std::make_unique<CCoinJoinClientManager>(wallet, *this , m_dmnman, m_mn_metaman,
1906
+ m_mn_sync, m_queueman, m_is_masternode));
1907
+ }
1902
1908
g_wallet_init_interface.InitCoinJoinSettings (*this );
1903
1909
}
1904
1910
1905
- void CoinJoinWalletManager::DoMaintenance () {
1906
- for (auto & [wallet_str, walletman] : m_wallet_manager_map) {
1907
- walletman->DoMaintenance (m_chainstate, m_connman, m_mempool);
1911
+ void CoinJoinWalletManager::DoMaintenance ()
1912
+ {
1913
+ LOCK (cs_wallet_manager_map);
1914
+ for (auto & [_, clientman] : m_wallet_manager_map) {
1915
+ clientman->DoMaintenance (m_chainstate, m_connman, m_mempool);
1908
1916
}
1909
1917
}
1910
1918
1911
1919
void CoinJoinWalletManager::Remove (const std::string& name) {
1912
- m_wallet_manager_map.erase (name);
1920
+ {
1921
+ LOCK (cs_wallet_manager_map);
1922
+ m_wallet_manager_map.erase (name);
1923
+ }
1913
1924
g_wallet_init_interface.InitCoinJoinSettings (*this );
1914
1925
}
1915
1926
1916
1927
void CoinJoinWalletManager::Flush (const std::string& name)
1917
1928
{
1918
- auto clientman = Get (name);
1919
- assert (clientman != nullptr );
1929
+ auto clientman = Assert (Get (name));
1920
1930
clientman->ResetPool ();
1921
1931
clientman->StopMixing ();
1922
1932
}
1923
1933
1924
1934
CCoinJoinClientManager* CoinJoinWalletManager::Get (const std::string& name) const
1925
1935
{
1936
+ LOCK (cs_wallet_manager_map);
1926
1937
auto it = m_wallet_manager_map.find (name);
1927
1938
return (it != m_wallet_manager_map.end ()) ? it->second .get () : nullptr ;
1928
1939
}
0 commit comments