Genericize plugin handling of thread jobs
Move it to the Plugins class so all plugins get it for free.
This commit is contained in:
parent
24cd18e193
commit
1171a25815
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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…
Reference in New Issue