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);