URI: 
       twallet.py: access unverified_tx with self.lock - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 1e06b1921e324ba41803f6e970a629be30037340
   DIR parent 060404e17c806e363a6f512e2f544f5c12821dd3
  HTML Author: SomberNight <somber.night@protonmail.com>
       Date:   Wed, 30 May 2018 19:01:47 +0200
       
       wallet.py: access unverified_tx with self.lock
       
       Only actually needed due to Imported_Wallet.delete_address, but it takes some time to see this.
       The verifier and the synchronizer both access unverified_tx but they are both run in the Network thread.
       In any case, there does not seem to be a measurable performance hit when using the lock.
       
       Diffstat:
         M lib/wallet.py                       |      16 ++++++++--------
       
       1 file changed, 8 insertions(+), 8 deletions(-)
       ---
   DIR diff --git a/lib/wallet.py b/lib/wallet.py
       t@@ -205,11 +205,9 @@ class Abstract_Wallet(PrintError):
                self.fiat_value            = storage.get('fiat_value', {})
                self.receive_requests      = storage.get('payment_requests', {})
        
       -        # Verified transactions.  Each value is a (height, timestamp, block_pos) tuple.  Access with self.lock.
       +        # Verified transactions.  txid -> (height, timestamp, block_pos).  Access with self.lock.
                self.verified_tx = storage.get('verified_tx3', {})
       -
       -        # Transactions pending verification.  A map from tx hash to transaction
       -        # height.  Access is not contended so no lock is needed.
       +        # Transactions pending verification.  txid -> tx_height. Access with self.lock.
                self.unverified_tx = defaultdict(int)
        
                self.load_keystore()
       t@@ -460,19 +458,21 @@ class Abstract_Wallet(PrintError):
        
                # tx will be verified only if height > 0
                if tx_hash not in self.verified_tx:
       -            self.unverified_tx[tx_hash] = tx_height
       +            with self.lock:
       +                self.unverified_tx[tx_hash] = tx_height
        
            def add_verified_tx(self, tx_hash, info):
       -        # Remove from the unverified map and add to the verified map and
       -        self.unverified_tx.pop(tx_hash, None)
       +        # Remove from the unverified map and add to the verified map
                with self.lock:
       +            self.unverified_tx.pop(tx_hash, None)
                    self.verified_tx[tx_hash] = info  # (tx_height, timestamp, pos)
                height, conf, timestamp = self.get_tx_height(tx_hash)
                self.network.trigger_callback('verified', tx_hash, height, conf, timestamp)
        
            def get_unverified_txs(self):
                '''Returns a map from tx hash to transaction height'''
       -        return self.unverified_tx
       +        with self.lock:
       +            return dict(self.unverified_tx)  # copy
        
            def undo_verifications(self, blockchain, height):
                '''Used by the verifier when a reorg has happened'''