From 41106a50d2be9358ab19e75c1d6d075a773525b7 Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Wed, 23 Apr 2014 08:40:48 +0200 Subject: 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. --- src/qt/walletmodel.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) (limited to 'src/qt/walletmodel.cpp') diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index 61f26107af..37d82ec063 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -98,18 +98,21 @@ void WalletModel::updateStatus() void WalletModel::pollBalanceChanged() { - bool heightChanged = false; - { - LOCK(cs_main); - if(chainActive.Height() != cachedNumBlocks) - { - // Balance and number of transactions might have changed - cachedNumBlocks = chainActive.Height(); - heightChanged = true; - } - } - if(heightChanged) + // Get required locks upfront. 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. + TRY_LOCK(cs_main, lockMain); + if(!lockMain) + return; + TRY_LOCK(wallet->cs_wallet, lockWallet); + if(!lockWallet) + return; + + if(chainActive.Height() != cachedNumBlocks) { + // Balance and number of transactions might have changed + cachedNumBlocks = chainActive.Height(); + checkBalanceChanged(); if(transactionTableModel) transactionTableModel->updateConfirmations(); -- cgit v1.2.3