asyncio: addr_sync: maybe fix "no current event loop in thread"
see https://github.com/spesmilo/electrum/issues/5376 crash report for electrum 4.2.1: ``` Traceback (most recent call last): File "/home/user/wspace/electrum/.buildozer/android/platform/build-arm64-v8a/build/python-installs/Electrum/kivy/base.py", line 347, in mainloop File "/home/user/wspace/electrum/.buildozer/android/platform/build-arm64-v8a/build/python-installs/Electrum/kivy/base.py", line 391, in idle File "/home/user/wspace/electrum/.buildozer/android/platform/build-arm64-v8a/build/python-installs/Electrum/kivy/base.py", line 342, in dispatch_input File "/home/user/wspace/electrum/.buildozer/android/platform/build-arm64-v8a/build/python-installs/Electrum/kivy/base.py", line 308, in post_dispatch_input File "kivy/_event.pyx", line 724, in kivy._event.EventDispatcher.dispatch File "/home/user/wspace/electrum/.buildozer/android/platform/build-arm64-v8a/build/python-installs/Electrum/kivy/uix/behaviors/button.py", line 179, in on_touch_up File "kivy/_event.pyx", line 720, in kivy._event.EventDispatcher.dispatch File "kivy/_event.pyx", line 1263, in kivy._event.EventObservers.dispatch File "kivy/_event.pyx", line 1147, in kivy._event.EventObservers._dispatch File "/home/user/wspace/electrum/.buildozer/android/platform/build-arm64-v8a/build/python-installs/Electrum/kivy/lang/builder.py", line 57, in custom_callback File "<string>", line 42, in <module> File "/home/user/wspace/electrum/.buildozer/android/app/electrum/gui/kivy/uix/dialogs/wallets.py", line 70, in cb File "/home/user/wspace/electrum/.buildozer/android/app/electrum/gui/kivy/main_window.py", line 710, in load_wallet_by_name File "/home/user/wspace/electrum/.buildozer/android/app/electrum/gui/kivy/main_window.py", line 728, in on_open_wallet File "/home/user/wspace/electrum/.buildozer/android/app/electrum/gui/kivy/main_window.py", line 691, in on_wizard_success File "/home/user/wspace/electrum/.buildozer/android/app/electrum/wallet.py", line 3267, in __new__ File "/home/user/wspace/electrum/.buildozer/android/app/electrum/wallet.py", line 3111, in __init__ File "/home/user/wspace/electrum/.buildozer/android/app/electrum/wallet.py", line 2904, in __init__ File "/home/user/wspace/electrum/.buildozer/android/app/electrum/wallet.py", line 288, in __init__ File "/home/user/wspace/electrum/.buildozer/android/app/electrum/address_synchronizer.py", line 97, in __init__ File "/home/user/wspace/electrum/.buildozer/android/app/electrum/wallet.py", line 402, in load_and_cleanup File "/home/user/wspace/electrum/.buildozer/android/app/electrum/address_synchronizer.py", line 106, in load_and_cleanup File "/home/user/wspace/electrum/.buildozer/android/app/electrum/util.py", line 439, in <lambda> File "/home/user/wspace/electrum/.buildozer/android/app/electrum/util.py", line 435, in do_profile File "/home/user/wspace/electrum/.buildozer/android/app/electrum/address_synchronizer.py", line 432, in load_local_history File "/home/user/wspace/electrum/.buildozer/android/app/electrum/address_synchronizer.py", line 533, in _add_tx_to_local_history File "/home/user/wspace/electrum/.buildozer/android/app/electrum/address_synchronizer.py", line 548, in _mark_address_history_changed File "/home/user/wspace/electrum/.buildozer/android/platform/build-arm64-v8a/build/other_builds/python3/arm64-v8a__ndk_target_21/python3/Lib/asyncio/locks.py", line 260, in __init__ File "/home/user/wspace/electrum/.buildozer/android/platform/build-arm64-v8a/build/other_builds/python3/arm64-v8a__ndk_target_21/python3/Lib/asyncio/events.py", line 639, in get_event_loop RuntimeError: There is no current event loop in thread 'GUI'. ```
This commit is contained in:
@@ -23,7 +23,6 @@
|
||||
|
||||
import asyncio
|
||||
import threading
|
||||
import asyncio
|
||||
import itertools
|
||||
from collections import defaultdict
|
||||
from typing import TYPE_CHECKING, Dict, Optional, Set, Tuple, NamedTuple, Sequence, List
|
||||
@@ -71,6 +70,7 @@ class AddressSynchronizer(Logger):
|
||||
"""
|
||||
|
||||
network: Optional['Network']
|
||||
asyncio_loop: Optional['asyncio.AbstractEventLoop'] = None
|
||||
synchronizer: Optional['Synchronizer']
|
||||
verifier: Optional['SPV']
|
||||
|
||||
@@ -185,6 +185,7 @@ class AddressSynchronizer(Logger):
|
||||
if self.network is not None:
|
||||
self.synchronizer = Synchronizer(self)
|
||||
self.verifier = SPV(self.network, self)
|
||||
self.asyncio_loop = network.asyncio_loop
|
||||
util.register_callback(self.on_blockchain_updated, ['blockchain_updated'])
|
||||
|
||||
def on_blockchain_updated(self, event, *args):
|
||||
@@ -560,10 +561,14 @@ class AddressSynchronizer(Logger):
|
||||
self._history_local[addr] = cur_hist
|
||||
|
||||
def _mark_address_history_changed(self, addr: str) -> None:
|
||||
# history for this address changed, wake up coroutines:
|
||||
self._address_history_changed_events[addr].set()
|
||||
# clear event immediately so that coroutines can wait() for the next change:
|
||||
self._address_history_changed_events[addr].clear()
|
||||
def set_and_clear():
|
||||
event = self._address_history_changed_events[addr]
|
||||
# history for this address changed, wake up coroutines:
|
||||
event.set()
|
||||
# clear event immediately so that coroutines can wait() for the next change:
|
||||
event.clear()
|
||||
if self.asyncio_loop:
|
||||
self.asyncio_loop.call_soon_threadsafe(set_and_clear)
|
||||
|
||||
async def wait_for_address_history_to_change(self, addr: str) -> None:
|
||||
"""Wait until the server tells us about a new transaction related to addr.
|
||||
|
||||
Reference in New Issue
Block a user