Browse Source

fx: asyncio.Event is not thread-safe; also the 'timeout' field was removed

master
SomberNight 7 years ago
parent
commit
6ccd83397c
No known key found for this signature in database
GPG Key ID: B33B5F232C6271E9
  1. 20
      electrum/exchange_rate.py
  2. 5
      electrum/gui/qt/main_window.py

20
electrum/exchange_rate.py

@ -443,13 +443,13 @@ class FxThread(ThreadJob):
self.ccy_combo = None self.ccy_combo = None
self.hist_checkbox = None self.hist_checkbox = None
self.cache_dir = os.path.join(config.path, 'cache') self.cache_dir = os.path.join(config.path, 'cache')
self.trigger = asyncio.Event() self._trigger = asyncio.Event()
self.trigger.set() self._trigger.set()
self.set_exchange(self.config_exchange()) self.set_exchange(self.config_exchange())
make_dir(self.cache_dir) make_dir(self.cache_dir)
def set_proxy(self, trigger_name, *args): def set_proxy(self, trigger_name, *args):
self.trigger.set() self._trigger.set()
def get_currencies(self, h): def get_currencies(self, h):
d = get_exchanges_by_ccy(h) d = get_exchanges_by_ccy(h)
@ -471,11 +471,11 @@ class FxThread(ThreadJob):
async def run(self): async def run(self):
while True: while True:
try: try:
await asyncio.wait_for(self.trigger.wait(), 150) await asyncio.wait_for(self._trigger.wait(), 150)
except concurrent.futures.TimeoutError: except concurrent.futures.TimeoutError:
pass pass
else: else:
self.trigger.clear() self._trigger.clear()
if self.is_enabled(): if self.is_enabled():
if self.show_history(): if self.show_history():
self.exchange.get_historical_rates(self.ccy, self.cache_dir) self.exchange.get_historical_rates(self.ccy, self.cache_dir)
@ -487,7 +487,7 @@ class FxThread(ThreadJob):
def set_enabled(self, b): def set_enabled(self, b):
self.config.set_key('use_exchange_rate', bool(b)) self.config.set_key('use_exchange_rate', bool(b))
self.trigger.set() self.trigger_update()
def get_history_config(self): def get_history_config(self):
return bool(self.config.get('history_rates')) return bool(self.config.get('history_rates'))
@ -520,9 +520,13 @@ class FxThread(ThreadJob):
def set_currency(self, ccy): def set_currency(self, ccy):
self.ccy = ccy self.ccy = ccy
self.config.set_key('currency', ccy, True) self.config.set_key('currency', ccy, True)
self.trigger.set() # Because self.ccy changes self.trigger_update()
self.on_quotes() self.on_quotes()
def trigger_update(self):
if self.network:
self.network.asyncio_loop.call_soon_threadsafe(self._trigger.set)
def set_exchange(self, name): def set_exchange(self, name):
class_ = globals().get(name, BitcoinAverage) class_ = globals().get(name, BitcoinAverage)
self.print_error("using exchange", name) self.print_error("using exchange", name)
@ -531,7 +535,7 @@ class FxThread(ThreadJob):
self.exchange = class_(self.on_quotes, self.on_history) self.exchange = class_(self.on_quotes, self.on_history)
# A new exchange means new fx quotes, initially empty. Force # A new exchange means new fx quotes, initially empty. Force
# a quote refresh # a quote refresh
self.trigger.set() self.trigger_update()
self.exchange.read_historical_rates(self.ccy, self.cache_dir) self.exchange.read_historical_rates(self.ccy, self.cache_dir)
def on_quotes(self): def on_quotes(self):

5
electrum/gui/qt/main_window.py

@ -2962,8 +2962,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
update_exchanges() update_exchanges()
self.history_list.refresh_headers() self.history_list.refresh_headers()
if self.fx.is_enabled() and checked: if self.fx.is_enabled() and checked:
# reset timeout to get historical rates self.fx.trigger_update()
self.fx.timeout = 0
update_history_capgains_cb() update_history_capgains_cb()
def on_history_capgains(checked): def on_history_capgains(checked):
@ -3025,7 +3024,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
d.exec_() d.exec_()
if self.fx: if self.fx:
self.fx.timeout = 0 self.fx.trigger_update()
self.alias_received_signal.disconnect(set_alias_color) self.alias_received_signal.disconnect(set_alias_color)

Loading…
Cancel
Save