From 2354a0a640854f8f8323bea89ead58c43921d1f9 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 6 Apr 2019 13:11:36 -0700 Subject: [PATCH] Fix unresponsive GUI on quit if a polling operation is in progress --- app/backend/computermanager.cpp | 19 +++++++++++++++++++ app/backend/computermanager.h | 2 ++ 2 files changed, 21 insertions(+) diff --git a/app/backend/computermanager.cpp b/app/backend/computermanager.cpp index 5461872d..5a5a497b 100644 --- a/app/backend/computermanager.cpp +++ b/app/backend/computermanager.cpp @@ -7,6 +7,7 @@ #include #include +#include #define SER_HOSTS "hosts" @@ -161,6 +162,13 @@ ComputerManager::ComputerManager(QObject *parent) m_KnownHosts[computer->uuid] = computer; } settings.endArray(); + + // To quit in a timely manner, we must block additional requests + // after we receive the aboutToQuit() signal. This is neccessary + // because NvHTTP uses aboutToQuit() to abort requests in progres + // while quitting, however this is a one time signal - additional + // requests would not be aborted and block termination. + connect(QCoreApplication::instance(), SIGNAL(aboutToQuit()), this, SLOT(handleAboutToQuit())); } ComputerManager::~ComputerManager() @@ -343,6 +351,17 @@ void ComputerManager::deleteHost(NvComputer* computer) QThreadPool::globalInstance()->start(new DeferredHostDeletionTask(this, computer)); } +void ComputerManager::handleAboutToQuit() +{ + QWriteLocker lock(&m_Lock); + + // Interrupt polling threads immediately, so they + // avoid making additional requests while quitting + for (ComputerPollingEntry* entry : m_PollEntries) { + entry->interrupt(); + } +} + class PendingPairingTask : public QObject, public QRunnable { Q_OBJECT diff --git a/app/backend/computermanager.h b/app/backend/computermanager.h index 9c3df5ee..6d21c909 100644 --- a/app/backend/computermanager.h +++ b/app/backend/computermanager.h @@ -161,6 +161,8 @@ signals: void quitAppCompleted(QVariant error); private slots: + void handleAboutToQuit(); + void handleComputerStateChanged(NvComputer* computer); void handleMdnsServiceResolved(MdnsPendingComputer* computer, const QHostAddress& address);