Browse Source

Genericize plugin handling of thread jobs

Move it to the Plugins class so all plugins get it for
free.
283
Neil Booth 10 years ago
parent
commit
1171a25815
  1. 29
      lib/plugins.py
  2. 9
      lib/util.py
  3. 6
      lib/wallet.py
  4. 14
      plugins/exchange_rate.py

29
lib/plugins.py

@ -26,6 +26,13 @@ from util import *
from i18n import _ from i18n import _
from util import print_error, profiler from util import print_error, profiler
hook_names = set()
hooks = {}
def hook(func):
hook_names.add(func.func_name)
return func
class Plugins: class Plugins:
@profiler @profiler
@ -40,6 +47,7 @@ class Plugins:
self.plugins = {} self.plugins = {}
self.windows = [] self.windows = []
self.network = None
self.descriptions = plugins.descriptions self.descriptions = plugins.descriptions
for item in self.descriptions: for item in self.descriptions:
name = item['name'] name = item['name']
@ -118,6 +126,17 @@ class Plugins:
x += (lambda: self.wallet_plugin_loader(config, name),) x += (lambda: self.wallet_plugin_loader(config, name),)
wallet.wallet_types.append(x) wallet.wallet_types.append(x)
@hook
def set_network(self, network):
if network != self.network:
jobs = [job in plugin.thread_jobs()
for plugin in self.plugins.values()]
if self.network:
self.network.remove_jobs(jobs)
self.network = network
if network:
network.add_jobs(jobs)
def trigger(self, event, *args, **kwargs): def trigger(self, event, *args, **kwargs):
for plugin in self.plugins.values(): for plugin in self.plugins.values():
getattr(plugin, event)(*args, **kwargs) getattr(plugin, event)(*args, **kwargs)
@ -130,13 +149,6 @@ class Plugins:
self.windows.remove(window) self.windows.remove(window)
self.trigger('on_close_window', window) self.trigger('on_close_window', window)
hook_names = set()
hooks = {}
def hook(func):
hook_names.add(func.func_name)
return func
def run_hook(name, *args): def run_hook(name, *args):
return _run_hook(name, False, *args) return _run_hook(name, False, *args)
@ -194,6 +206,9 @@ class BasePlugin:
def requires_settings(self): def requires_settings(self):
return False return False
def thread_jobs(self):
return []
@hook @hook
def load_wallet(self, wallet, window): pass def load_wallet(self, wallet, window): pass

9
lib/util.py

@ -51,9 +51,9 @@ class DaemonThread(threading.Thread):
self.job_lock = threading.Lock() self.job_lock = threading.Lock()
self.jobs = [] self.jobs = []
def add_job(self, job): def add_jobs(self, jobs):
with self.job_lock: with self.job_lock:
self.jobs.append(job) self.jobs.extend(jobs)
def run_jobs(self): def run_jobs(self):
# Don't let a throwing job disrupt the thread, future runs of # Don't let a throwing job disrupt the thread, future runs of
@ -66,9 +66,10 @@ class DaemonThread(threading.Thread):
except: except:
traceback.print_exc(file=sys.stderr) traceback.print_exc(file=sys.stderr)
def remove_job(self, job): def remove_jobs(self, jobs):
with self.job_lock: with self.job_lock:
self.jobs.remove(job) for job in jobs:
self.jobs.remove(job)
def start(self): def start(self):
with self.running_lock: with self.running_lock:

6
lib/wallet.py

@ -1109,17 +1109,15 @@ class Abstract_Wallet(object):
if self.network is not None: if self.network is not None:
self.prepare_for_verifier() self.prepare_for_verifier()
self.verifier = SPV(self.network, self) self.verifier = SPV(self.network, self)
network.add_job(self.verifier)
self.synchronizer = Synchronizer(self, network) self.synchronizer = Synchronizer(self, network)
network.add_job(self.synchronizer) network.add_jobs([self.verifier, self.synchronizer])
else: else:
self.verifier = None self.verifier = None
self.synchronizer = None self.synchronizer = None
def stop_threads(self): def stop_threads(self):
if self.network: if self.network:
self.network.remove_job(self.synchronizer) self.network.remove_jobs([self.synchronizer, self.verifier])
self.network.remove_job(self.verifier)
self.synchronizer = None self.synchronizer = None
self.verifier = None self.verifier = None
self.storage.put('stored_height', self.get_local_height(), True) self.storage.put('stored_height', self.get_local_height(), True)

14
plugins/exchange_rate.py

@ -193,13 +193,15 @@ class Plugin(BasePlugin, ThreadJob):
and issubclass(obj, ExchangeBase)) and issubclass(obj, ExchangeBase))
self.exchanges = dict(inspect.getmembers(sys.modules[__name__], self.exchanges = dict(inspect.getmembers(sys.modules[__name__],
is_exchange)) is_exchange))
self.network = None
self.set_exchange(self.config_exchange()) self.set_exchange(self.config_exchange())
self.currencies = [self.fiat_unit()] self.currencies = [self.fiat_unit()]
self.btc_rate = Decimal("0.0") self.btc_rate = Decimal("0.0")
self.get_historical_rates() self.get_historical_rates()
self.timeout = 0 self.timeout = 0
def thread_jobs(self):
return [self]
def run(self): def run(self):
# This runs from the network thread which catches exceptions # This runs from the network thread which catches exceptions
if self.parent.windows and self.timeout <= time.time(): if self.parent.windows and self.timeout <= time.time():
@ -222,15 +224,6 @@ class Plugin(BasePlugin, ThreadJob):
self.config.set_key('use_exchange', name, True) self.config.set_key('use_exchange', name, True)
self.exchange = class_() self.exchange = class_()
@hook
def set_network(self, network):
if network != self.network:
if self.network:
self.network.remove_job(self)
self.network = network
if network:
network.add_job(self)
def on_new_window(self, window): def on_new_window(self, window):
window.connect(window, SIGNAL("refresh_currencies()"), window.connect(window, SIGNAL("refresh_currencies()"),
window.update_status) window.update_status)
@ -241,7 +234,6 @@ class Plugin(BasePlugin, ThreadJob):
def close(self): def close(self):
BasePlugin.close(self) BasePlugin.close(self)
self.set_network(None)
for window in self.parent.windows: for window in self.parent.windows:
window.send_fiat_e.hide() window.send_fiat_e.hide()
window.receive_fiat_e.hide() window.receive_fiat_e.hide()

Loading…
Cancel
Save