nodaemon
authorThomasV <thomasv@gitorious>
Mon, 5 Nov 2012 22:10:38 +0000 (23:10 +0100)
committerThomasV <thomasv@gitorious>
Sat, 24 Nov 2012 19:35:09 +0000 (20:35 +0100)
electrum
lib/verifier.py
lib/wallet.py

index dcaefb3..9134cca 100755 (executable)
--- 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()
index 76d19ba..e96d50b 100644 (file)
@@ -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
index fbca4e2..0861cd0 100644 (file)
@@ -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