@@ -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 " 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 " 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 " 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 " 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 " 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 " original );
18091812
@@ -1894,35 +1897,43 @@ void CCoinJoinClientManager::GetJsonInfo(UniValue& obj) const
18941897    obj.pushKV (" sessions" 
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