Changeset View
Changeset View
Standalone View
Standalone View
src/wallet/wallet.cpp
Show First 20 Lines • Show All 94 Lines • ▼ Show 20 Lines | HandleLoadWallet(LoadWalletFn load_wallet) { | ||||
auto it = g_load_wallet_fns.emplace(g_load_wallet_fns.end(), | auto it = g_load_wallet_fns.emplace(g_load_wallet_fns.end(), | ||||
std::move(load_wallet)); | std::move(load_wallet)); | ||||
return interfaces::MakeHandler([it] { | return interfaces::MakeHandler([it] { | ||||
LOCK(cs_wallets); | LOCK(cs_wallets); | ||||
g_load_wallet_fns.erase(it); | g_load_wallet_fns.erase(it); | ||||
}); | }); | ||||
} | } | ||||
static Mutex g_loading_wallet_mutex; | |||||
static Mutex g_wallet_release_mutex; | static Mutex g_wallet_release_mutex; | ||||
static std::condition_variable g_wallet_release_cv; | static std::condition_variable g_wallet_release_cv; | ||||
static std::set<std::string> g_unloading_wallet_set; | static std::set<std::string> | ||||
g_loading_wallet_set GUARDED_BY(g_loading_wallet_mutex); | |||||
static std::set<std::string> | |||||
g_unloading_wallet_set GUARDED_BY(g_wallet_release_mutex); | |||||
// Custom deleter for shared_ptr<CWallet>. | // Custom deleter for shared_ptr<CWallet>. | ||||
static void ReleaseWallet(CWallet *wallet) { | static void ReleaseWallet(CWallet *wallet) { | ||||
const std::string name = wallet->GetName(); | const std::string name = wallet->GetName(); | ||||
wallet->WalletLogPrintf("Releasing wallet\n"); | wallet->WalletLogPrintf("Releasing wallet\n"); | ||||
wallet->Flush(); | wallet->Flush(); | ||||
delete wallet; | delete wallet; | ||||
// Wallet is now released, notify UnloadWallet, if any. | // Wallet is now released, notify UnloadWallet, if any. | ||||
Show All 27 Lines | wallet.reset(); | ||||
while (g_unloading_wallet_set.count(name) == 1) { | while (g_unloading_wallet_set.count(name) == 1) { | ||||
g_wallet_release_cv.wait(lock); | g_wallet_release_cv.wait(lock); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
static const size_t OUTPUT_GROUP_MAX_ENTRIES = 10; | static const size_t OUTPUT_GROUP_MAX_ENTRIES = 10; | ||||
std::shared_ptr<CWallet> LoadWallet(const CChainParams &chainParams, | namespace { | ||||
interfaces::Chain &chain, | std::shared_ptr<CWallet> | ||||
const WalletLocation &location, | LoadWalletInternal(const CChainParams &chainParams, interfaces::Chain &chain, | ||||
bilingual_str &error, | const WalletLocation &location, bilingual_str &error, | ||||
std::vector<bilingual_str> &warnings) { | std::vector<bilingual_str> &warnings) { | ||||
try { | try { | ||||
if (!CWallet::Verify(chainParams, chain, location, error, warnings)) { | if (!CWallet::Verify(chainParams, chain, location, error, warnings)) { | ||||
error = Untranslated("Wallet file verification failed.") + | error = Untranslated("Wallet file verification failed.") + | ||||
Untranslated(" ") + error; | Untranslated(" ") + error; | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
std::shared_ptr<CWallet> wallet = CWallet::CreateWalletFromFile( | std::shared_ptr<CWallet> wallet = CWallet::CreateWalletFromFile( | ||||
chainParams, chain, location, error, warnings); | chainParams, chain, location, error, warnings); | ||||
if (!wallet) { | if (!wallet) { | ||||
error = Untranslated("Wallet loading failed.") + Untranslated(" ") + | error = Untranslated("Wallet loading failed.") + Untranslated(" ") + | ||||
error; | error; | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
AddWallet(wallet); | AddWallet(wallet); | ||||
wallet->postInitProcess(); | wallet->postInitProcess(); | ||||
return wallet; | return wallet; | ||||
} catch (const std::runtime_error &e) { | } catch (const std::runtime_error &e) { | ||||
error = Untranslated(e.what()); | error = Untranslated(e.what()); | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
} | } | ||||
} // namespace | |||||
std::shared_ptr<CWallet> LoadWallet(const CChainParams &chainParams, | |||||
interfaces::Chain &chain, | |||||
const WalletLocation &location, | |||||
bilingual_str &error, | |||||
std::vector<bilingual_str> &warnings) { | |||||
auto result = | |||||
WITH_LOCK(g_loading_wallet_mutex, | |||||
return g_loading_wallet_set.insert(location.GetName())); | |||||
if (!result.second) { | |||||
error = Untranslated("Wallet already being loading."); | |||||
return nullptr; | |||||
} | |||||
auto wallet = | |||||
LoadWalletInternal(chainParams, chain, location, error, warnings); | |||||
WITH_LOCK(g_loading_wallet_mutex, g_loading_wallet_set.erase(result.first)); | |||||
return wallet; | |||||
} | |||||
std::shared_ptr<CWallet> LoadWallet(const CChainParams &chainParams, | std::shared_ptr<CWallet> LoadWallet(const CChainParams &chainParams, | ||||
interfaces::Chain &chain, | interfaces::Chain &chain, | ||||
const std::string &name, | const std::string &name, | ||||
bilingual_str &error, | bilingual_str &error, | ||||
std::vector<bilingual_str> &warnings) { | std::vector<bilingual_str> &warnings) { | ||||
return LoadWallet(chainParams, chain, WalletLocation(name), error, | return LoadWallet(chainParams, chain, WalletLocation(name), error, | ||||
warnings); | warnings); | ||||
▲ Show 20 Lines • Show All 4,873 Lines • Show Last 20 Lines |