From d4c386a62ca836afcedb390517323ae90e8dffd7 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Wed, 5 Apr 2023 12:26:32 +0200 Subject: [PATCH] qml: use daemon threads everywhere the network is involved The app hangs indefinitely if we try to quit it while one of these threads is active, because once asyncio has shut down, futures never return. This was already fixed for lightning payments in c5dc133, but there are many other cases. --- electrum/gui/qml/qeapp.py | 2 +- electrum/gui/qml/qechanneldetails.py | 2 +- electrum/gui/qml/qechannelopener.py | 2 +- electrum/gui/qml/qeinvoice.py | 4 ++-- electrum/gui/qml/qeswaphelper.py | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/electrum/gui/qml/qeapp.py b/electrum/gui/qml/qeapp.py index 05e2a2c4f..b04ddfda2 100644 --- a/electrum/gui/qml/qeapp.py +++ b/electrum/gui/qml/qeapp.py @@ -265,7 +265,7 @@ class QEAppController(BaseCrashReporter, QObject): self.sendingBugreportSuccess.emit(text) self.sendingBugreport.emit() - threading.Thread(target=report_task).start() + threading.Thread(target=report_task, daemon=True).start() @pyqtSlot() def showNever(self): diff --git a/electrum/gui/qml/qechanneldetails.py b/electrum/gui/qml/qechanneldetails.py index 12afb7794..e219e3394 100644 --- a/electrum/gui/qml/qechanneldetails.py +++ b/electrum/gui/qml/qechanneldetails.py @@ -194,7 +194,7 @@ class QEChannelDetails(QObject, QtEventListener): self._logger.exception("Could not close channel: " + repr(e)) self.channelCloseFailed.emit(_('Could not close channel: ') + repr(e)) - threading.Thread(target=do_close).start() + threading.Thread(target=do_close, daemon=True).start() @pyqtSlot() def deleteChannel(self): diff --git a/electrum/gui/qml/qechannelopener.py b/electrum/gui/qml/qechannelopener.py index 9b2947e7a..a4bae2eb0 100644 --- a/electrum/gui/qml/qechannelopener.py +++ b/electrum/gui/qml/qechannelopener.py @@ -216,7 +216,7 @@ class QEChannelOpener(QObject, AuthMixin): self._logger.debug('starting open thread') self.channelOpening.emit(conn_str) - threading.Thread(target=open_thread).start() + threading.Thread(target=open_thread, daemon=True).start() # TODO: it would be nice to show this before broadcasting #if chan.has_onchain_backup(): diff --git a/electrum/gui/qml/qeinvoice.py b/electrum/gui/qml/qeinvoice.py index a17ed9d05..40ed6e13a 100644 --- a/electrum/gui/qml/qeinvoice.py +++ b/electrum/gui/qml/qeinvoice.py @@ -587,7 +587,7 @@ class QEInvoiceParser(QEInvoice): except Exception as e: self.validationError.emit('lnurl', repr(e)) - threading.Thread(target=resolve_task).start() + threading.Thread(target=resolve_task, daemon=True).start() def on_lnurl(self, lnurldata): self._logger.debug('on_lnurl') @@ -635,7 +635,7 @@ class QEInvoiceParser(QEInvoice): self._logger.error(repr(e)) self.lnurlError.emit('lnurl', str(e)) - threading.Thread(target=fetch_invoice_task).start() + threading.Thread(target=fetch_invoice_task, daemon=True).start() def on_lnurl_invoice(self, orig_amount, invoice): self._logger.debug('on_lnurl_invoice') diff --git a/electrum/gui/qml/qeswaphelper.py b/electrum/gui/qml/qeswaphelper.py index 09107859f..eb6745add 100644 --- a/electrum/gui/qml/qeswaphelper.py +++ b/electrum/gui/qml/qeswaphelper.py @@ -350,7 +350,7 @@ class QESwapHelper(AuthMixin, QObject): self._logger.error(str(e)) self.swapFailed.emit(str(e)) - threading.Thread(target=swap_task).start() + threading.Thread(target=swap_task, daemon=True).start() def do_reverse_swap(self, lightning_amount, onchain_amount): if lightning_amount is None or onchain_amount is None: @@ -375,7 +375,7 @@ class QESwapHelper(AuthMixin, QObject): self._logger.error(str(e)) self.swapFailed.emit(str(e)) - threading.Thread(target=swap_task).start() + threading.Thread(target=swap_task, daemon=True).start(d) @pyqtSlot() @pyqtSlot(bool)