qt: get required locks upfront in polling functions

This avoids the GUI from getting stuck on
periodical polls if the core is holding the locks for a longer time -
for example, during a wallet rescan.
This commit is contained in:
Wladimir J. van der Laan
2014-04-23 08:40:48 +02:00
parent ed67100565
commit 41106a50d2
3 changed files with 34 additions and 18 deletions

View File

@@ -24,7 +24,6 @@
#include <QDebug>
#include <QIcon>
#include <QList>
#include <QTimer>
// Amount column is right-aligned it contains numbers
static int column_alignments[] = {
@@ -187,17 +186,25 @@ public:
{
TransactionRecord *rec = &cachedWallet[idx];
// Get required locks upfront. This avoids the GUI from getting
// stuck if the core is holding the locks for a longer time - for
// example, during a wallet rescan.
//
// If a status update is needed (blocks came in since last check),
// update the status of this transaction from the wallet. Otherwise,
// simply re-use the cached status.
LOCK2(cs_main, wallet->cs_wallet);
if(rec->statusUpdateNeeded())
TRY_LOCK(cs_main, lockMain);
if(lockMain)
{
std::map<uint256, CWalletTx>::iterator mi = wallet->mapWallet.find(rec->hash);
if(mi != wallet->mapWallet.end())
TRY_LOCK(wallet->cs_wallet, lockWallet);
if(lockWallet && rec->statusUpdateNeeded())
{
rec->updateStatus(mi->second);
std::map<uint256, CWalletTx>::iterator mi = wallet->mapWallet.find(rec->hash);
if(mi != wallet->mapWallet.end())
{
rec->updateStatus(mi->second);
}
}
}
return rec;