@@ -96,11 +96,9 @@ PeerMsgRet CCoinJoinClientQueueManager::ProcessDSQueue(const CNode& peer, CDataS
9696 }
9797
9898 // 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+ })) {
104102 LogPrint (BCLog::COINJOIN, " DSQUEUE -- CoinJoin queue (%s) is ready on masternode %s\n " , dsq.ToString (),
105103 dmn->pdmnState ->addr .ToString ());
106104 return {};
@@ -121,8 +119,9 @@ PeerMsgRet CCoinJoinClientQueueManager::ProcessDSQueue(const CNode& peer, CDataS
121119 LogPrint (BCLog::COINJOIN, " DSQUEUE -- new CoinJoin queue (%s) from masternode %s\n " , dsq.ToString (),
122120 dmn->pdmnState ->addr .ToString ());
123121
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+ });
126125
127126 WITH_LOCK (cs_vecqueue, vecCoinJoinQueue.push_back (dsq));
128127 }
@@ -155,11 +154,14 @@ void CCoinJoinClientManager::ProcessMessage(CNode& peer, CChainState& active_cha
155154 }
156155}
157156
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) :
160162 m_wallet(wallet),
161163 m_walletman(walletman),
162- m_manager(* Assert (walletman.Get(wallet.GetName())) ),
164+ m_clientman(clientman ),
163165 m_dmnman(dmnman),
164166 m_mn_metaman(mn_metaman),
165167 m_mn_sync(mn_sync),
@@ -684,7 +686,7 @@ void CCoinJoinClientSession::CompletedTransaction(PoolMessage nMessageID)
684686 if (m_is_masternode) return ;
685687
686688 if (nMessageID == MSG_SUCCESS) {
687- m_manager .UpdatedSuccessBlock ();
689+ m_clientman .UpdatedSuccessBlock ();
688690 keyHolderStorage.KeepAll ();
689691 WalletCJLogPrint (m_wallet, " CompletedTransaction -- success\n " );
690692 } else {
@@ -995,7 +997,8 @@ bool CCoinJoinClientManager::DoAutomaticDenominating(CChainState& active_chainst
995997 AssertLockNotHeld (cs_deqsessions);
996998 LOCK (cs_deqsessions);
997999 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);
9991002 }
10001003 for (auto & session : deqSessions) {
10011004 if (!CheckAutomaticBackup ()) return false ;
@@ -1100,7 +1103,7 @@ bool CCoinJoinClientSession::JoinExistingQueue(CAmount nBalanceNeedsAnonymized,
11001103 continue ;
11011104 }
11021105
1103- m_manager .AddUsedMasternode (dsq.masternodeOutpoint );
1106+ m_clientman .AddUsedMasternode (dsq.masternodeOutpoint );
11041107
11051108 if (connman.IsMasternodeOrDisconnectRequested (dmn->pdmnState ->addr )) {
11061109 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
11451148
11461149 // otherwise, try one randomly
11471150 while (nTries < 10 ) {
1148- auto dmn = m_manager .GetRandomNotUsedMasternode ();
1151+ auto dmn = m_clientman .GetRandomNotUsedMasternode ();
11491152 if (!dmn) {
11501153 strAutoDenomResult = _ (" Can't find random Masternode." );
11511154 WalletCJLogPrint (m_wallet, " CCoinJoinClientSession::StartNewQueue -- %s\n " , strAutoDenomResult.original );
11521155 return false ;
11531156 }
11541157
1155- m_manager .AddUsedMasternode (dmn->collateralOutpoint );
1158+ m_clientman .AddUsedMasternode (dmn->collateralOutpoint );
11561159
11571160 // skip next mn payments winners
11581161 if (dmn->pdmnState ->nLastPaidHeight + nWeightedMnCount < mnList.GetHeight () + WinnersToSkip ()) {
@@ -1526,7 +1529,7 @@ bool CCoinJoinClientSession::MakeCollateralAmounts(const CompactTallyItem& tally
15261529 return false ;
15271530 }
15281531
1529- m_manager .UpdatedSuccessBlock ();
1532+ m_clientman .UpdatedSuccessBlock ();
15301533
15311534 WalletCJLogPrint (m_wallet, " CCoinJoinClientSession::%s -- txid: %s\n " , __func__, strResult.original );
15321535
@@ -1803,7 +1806,7 @@ bool CCoinJoinClientSession::CreateDenominated(CAmount nBalanceToDenominate, con
18031806 }
18041807
18051808 // use the same nCachedLastSuccessBlock as for DS mixing to prevent race
1806- m_manager .UpdatedSuccessBlock ();
1809+ m_clientman .UpdatedSuccessBlock ();
18071810
18081811 WalletCJLogPrint (m_wallet, " CCoinJoinClientSession::%s -- txid: %s\n " , __func__, strResult.original );
18091812
@@ -1894,35 +1897,43 @@ void CCoinJoinClientManager::GetJsonInfo(UniValue& obj) const
18941897 obj.pushKV (" sessions" , arrSessions);
18951898}
18961899
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+ }
19021908 g_wallet_init_interface.InitCoinJoinSettings (*this );
19031909}
19041910
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);
19081916 }
19091917}
19101918
19111919void 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+ }
19131924 g_wallet_init_interface.InitCoinJoinSettings (*this );
19141925}
19151926
19161927void CoinJoinWalletManager::Flush (const std::string& name)
19171928{
1918- auto clientman = Get (name);
1919- assert (clientman != nullptr );
1929+ auto clientman = Assert (Get (name));
19201930 clientman->ResetPool ();
19211931 clientman->StopMixing ();
19221932}
19231933
19241934CCoinJoinClientManager* CoinJoinWalletManager::Get (const std::string& name) const
19251935{
1936+ LOCK (cs_wallet_manager_map);
19261937 auto it = m_wallet_manager_map.find (name);
19271938 return (it != m_wallet_manager_map.end ()) ? it->second .get () : nullptr ;
19281939}
0 commit comments