twallet: lock in get_addr_io, get_tx_delta, get_tx_value - electrum - Electrum Bitcoin wallet (HTM) git clone https://git.parazyd.org/electrum (DIR) Log (DIR) Files (DIR) Refs (DIR) Submodules --- (DIR) commit 435efb47d07a0ddb0604c4dadfe2747cf46cdbc1 (DIR) parent 1b95cced5d9251919b98f2a116bc79caaaf9f8bc (HTM) Author: SomberNight <somber.night@protonmail.com> Date: Mon, 17 Sep 2018 18:50:47 +0200 wallet: lock in get_addr_io, get_tx_delta, get_tx_value probably fixes #4716 Diffstat: M electrum/address_synchronizer.py | 35 +++++++++++++++++++------------ 1 file changed, 22 insertions(+), 13 deletions(-) --- (DIR) diff --git a/electrum/address_synchronizer.py b/electrum/address_synchronizer.py t@@ -80,6 +80,12 @@ class AddressSynchronizer(PrintError): self.load_and_cleanup() + def with_transaction_lock(func): + def func_wrapper(self, *args, **kwargs): + with self.transaction_lock: + return func(self, *args, **kwargs) + return func_wrapper + def load_and_cleanup(self): self.load_transactions() self.load_local_history() t@@ -651,8 +657,9 @@ class AddressSynchronizer(PrintError): def is_up_to_date(self): with self.lock: return self.up_to_date + @with_transaction_lock def get_tx_delta(self, tx_hash, address): - "effect of tx on address" + """effect of tx on address""" delta = 0 # substract the value of coins sent from address d = self.txi.get(tx_hash, {}).get(address, []) t@@ -664,8 +671,9 @@ class AddressSynchronizer(PrintError): delta += v return delta + @with_transaction_lock def get_tx_value(self, txid): - " effect of tx on the entire domain" + """effect of tx on the entire domain""" delta = 0 for addr, d in self.txi.get(txid, {}).items(): for n, v in d: t@@ -728,17 +736,18 @@ class AddressSynchronizer(PrintError): return is_relevant, is_mine, v, fee def get_addr_io(self, address): - h = self.get_address_history(address) - received = {} - sent = {} - for tx_hash, height in h: - l = self.txo.get(tx_hash, {}).get(address, []) - for n, v, is_cb in l: - received[tx_hash + ':%d'%n] = (height, v, is_cb) - for tx_hash, height in h: - l = self.txi.get(tx_hash, {}).get(address, []) - for txi, v in l: - sent[txi] = height + with self.lock, self.transaction_lock: + h = self.get_address_history(address) + received = {} + sent = {} + for tx_hash, height in h: + l = self.txo.get(tx_hash, {}).get(address, []) + for n, v, is_cb in l: + received[tx_hash + ':%d'%n] = (height, v, is_cb) + for tx_hash, height in h: + l = self.txi.get(tx_hash, {}).get(address, []) + for txi, v in l: + sent[txi] = height return received, sent def get_addr_utxo(self, address):