commit 0ad7f72d3d2a2f473916ade21db5bfc680d7d0d2
parent 8308440ded80419bac745f824a6e1a2eb740d12d
Author: ThomasV <thomasv@gitorious>
Date: Mon, 5 Nov 2012 23:10:38 +0100
nodaemon
Diffstat:
3 files changed, 39 insertions(+), 9 deletions(-)
diff --git a/electrum b/electrum
@@ -250,6 +250,9 @@ if __name__ == '__main__':
verifier.start()
gui.main(url)
wallet.save()
+ verifier.stop()
+ synchronizer.stop()
+ #interface.stop()
sys.exit(0)
if cmd not in known_commands:
@@ -343,10 +346,11 @@ if __name__ == '__main__':
# open session
if cmd not in offline_commands and not options.offline:
interface = Interface(config)
- interface.register_callback('connected', lambda: print_error("Connected to " + interface.connection_msg))
+ interface.register_callback('connected', lambda: sys.stderr.write("Connected to " + interface.connection_msg + "\n"))
interface.start()
wallet.interface = interface
- WalletSynchronizer(wallet, config).start()
+ synchronizer = WalletSynchronizer(wallet, config)
+ synchronizer.start()
wallet.update()
wallet.save()
@@ -643,3 +647,6 @@ if __name__ == '__main__':
addr = args[1]
print_msg(wallet.unprioritize(addr))
+
+ if cmd not in offline_commands and not options.offline:
+ synchronizer.stop()
diff --git a/lib/verifier.py b/lib/verifier.py
@@ -29,7 +29,7 @@ class WalletVerifier(threading.Thread):
def __init__(self, interface, config):
threading.Thread.__init__(self)
- self.daemon = True
+ #self.daemon = True
self.config = config
self.interface = interface
self.transactions = {} # requested verifications (with height sent by the requestor)
@@ -45,6 +45,7 @@ class WalletVerifier(threading.Thread):
self.local_height = 0
self.init_headers_file()
self.set_local_height()
+ self.running = False
def get_confirmations(self, tx):
""" return the number of confirmations of a monitored transaction. """
@@ -62,7 +63,15 @@ class WalletVerifier(threading.Thread):
if tx_hash not in self.transactions.keys():
self.transactions[tx_hash] = tx_height
+ def stop(self):
+ with self.lock: self.running = False
+
+ def is_running(self):
+ with self.lock: return self.running
+
def run(self):
+ with self.lock:
+ self.running = True
requested_merkle = []
requested_chunks = []
requested_headers = []
@@ -71,7 +80,7 @@ class WalletVerifier(threading.Thread):
# subscribe to block headers
self.interface.send([ ('blockchain.headers.subscribe',[])], 'verifier')
- while True:
+ while self.is_running():
# request missing chunks
if not all_chunks and self.height and not requested_chunks:
@@ -117,9 +126,8 @@ class WalletVerifier(threading.Thread):
self.pending_headers.remove(header)
try:
- r = self.interface.get_response('verifier',timeout=1)
+ r = self.interface.get_response('verifier',timeout=0.1)
except Queue.Empty:
- time.sleep(1)
continue
# 3. handle response
diff --git a/lib/wallet.py b/lib/wallet.py
@@ -1153,13 +1153,21 @@ class WalletSynchronizer(threading.Thread):
def __init__(self, wallet, config):
threading.Thread.__init__(self)
- self.daemon = True
+ # self.daemon = True
self.wallet = wallet
self.interface = self.wallet.interface
self.interface.register_channel('synchronizer')
self.wallet.interface.register_callback('connected', lambda: self.wallet.set_up_to_date(False))
self.wallet.interface.register_callback('connected', lambda: self.interface.send([('server.banner',[])],'synchronizer') )
self.was_updated = True
+ self.running = False
+ self.lock = threading.Lock()
+
+ def stop(self):
+ with self.lock: self.running = False
+
+ def is_running(self):
+ with self.lock: return self.running
def synchronize_wallet(self):
new_addresses = self.wallet.synchronize()
@@ -1186,6 +1194,8 @@ class WalletSynchronizer(threading.Thread):
def run(self):
+ with self.lock: self.running = True
+
requested_tx = []
missing_tx = []
requested_histories = {}
@@ -1208,7 +1218,7 @@ class WalletSynchronizer(threading.Thread):
# subscriptions
self.subscribe_to_addresses(self.wallet.all_addresses())
- while True:
+ while self.is_running():
# 1. send new requests
self.synchronize_wallet()
@@ -1223,7 +1233,12 @@ class WalletSynchronizer(threading.Thread):
self.was_updated = False
# 2. get a response
- r = self.interface.get_response('synchronizer')
+ try:
+ r = self.interface.get_response('synchronizer', timeout=0.1)
+ except:
+ continue
+
+ # poke sends None. (check if still needed)
if not r:
continue