@@ -99,9 +99,11 @@ std::unique_ptr<interfaces::Handler> HandleLoadWallet(LoadWalletFn load_wallet)
99
99
return interfaces::MakeHandler ([it] { LOCK (cs_wallets); g_load_wallet_fns.erase (it); });
100
100
}
101
101
102
+ static Mutex g_loading_wallet_mutex;
102
103
static Mutex g_wallet_release_mutex;
103
104
static std::condition_variable g_wallet_release_cv;
104
- static std::set<std::string> g_unloading_wallet_set;
105
+ static std::set<std::string> g_loading_wallet_set GUARDED_BY (g_loading_wallet_mutex);
106
+ static std::set<std::string> g_unloading_wallet_set GUARDED_BY (g_wallet_release_mutex);
105
107
106
108
// Custom deleter for shared_ptr<CWallet>.
107
109
static void ReleaseWallet (CWallet* wallet)
@@ -145,7 +147,8 @@ void UnloadWallet(std::shared_ptr<CWallet>&& wallet)
145
147
}
146
148
}
147
149
148
- std::shared_ptr<CWallet> LoadWallet (interfaces::Chain& chain, const WalletLocation& location, bilingual_str& error, std::vector<bilingual_str>& warnings)
150
+ namespace {
151
+ std::shared_ptr<CWallet> LoadWalletInternal (interfaces::Chain& chain, const WalletLocation& location, bilingual_str& error, std::vector<bilingual_str>& warnings)
149
152
{
150
153
try {
151
154
if (!CWallet::Verify (chain, location, error, warnings)) {
@@ -166,6 +169,19 @@ std::shared_ptr<CWallet> LoadWallet(interfaces::Chain& chain, const WalletLocati
166
169
return nullptr ;
167
170
}
168
171
}
172
+ } // namespace
173
+
174
+ std::shared_ptr<CWallet> LoadWallet (interfaces::Chain& chain, const WalletLocation& location, bilingual_str& error, std::vector<bilingual_str>& warnings)
175
+ {
176
+ auto result = WITH_LOCK (g_loading_wallet_mutex, return g_loading_wallet_set.insert (location.GetName ()));
177
+ if (!result.second ) {
178
+ error = Untranslated (" Wallet already being loading." );
179
+ return nullptr ;
180
+ }
181
+ auto wallet = LoadWalletInternal (chain, location, error, warnings);
182
+ WITH_LOCK (g_loading_wallet_mutex, g_loading_wallet_set.erase (result.first ));
183
+ return wallet;
184
+ }
169
185
170
186
std::shared_ptr<CWallet> LoadWallet (interfaces::Chain& chain, const std::string& name, bilingual_str& error, std::vector<bilingual_str>& warnings)
171
187
{
0 commit comments