From 5ee135871287675581fd09e4daded7488ff524c2 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 18 Jul 2018 21:27:43 -0700 Subject: [PATCH] Implement a proper destructor for ComputerManager to prevent polling threads from living beyond QGuiApplication --- app/backend/computermanager.cpp | 50 +++++++++++++++++++++++++++++++++ app/backend/computermanager.h | 2 ++ 2 files changed, 52 insertions(+) diff --git a/app/backend/computermanager.cpp b/app/backend/computermanager.cpp index 37b2c943..ae806899 100644 --- a/app/backend/computermanager.cpp +++ b/app/backend/computermanager.cpp @@ -286,6 +286,56 @@ ComputerManager::ComputerManager(QObject *parent) settings.endArray(); } +ComputerManager::~ComputerManager() +{ + QWriteLocker lock(&m_Lock); + + // Delete machines that haven't been resolved yet + while (!m_PendingResolution.isEmpty()) { + MdnsPendingComputer* computer = m_PendingResolution.first(); + delete computer; + m_PendingResolution.removeFirst(); + } + + // Delete the browser to stop discovery + delete m_MdnsBrowser; + m_MdnsBrowser = nullptr; + + { + QMutableMapIterator i(m_PollThreads); + + // Interrupt all polling threads + while (i.hasNext()) { + i.next(); + i.value()->requestInterruption(); + } + + // Wait for all threads to terminate before destroying + // the NvComputer objects. + i.toFront(); + while (i.hasNext()) { + i.next(); + + QThread* thread = i.value(); + thread->wait(); + delete thread; + + i.remove(); + } + } + + { + QMutableMapIterator i(m_KnownHosts); + + // Destroy all NvComputer objects + while (i.hasNext()) { + i.next(); + delete i.value(); + i.remove(); + } + } +} + void ComputerManager::saveHosts() { QSettings settings; diff --git a/app/backend/computermanager.h b/app/backend/computermanager.h index 645afc72..1b0de89b 100644 --- a/app/backend/computermanager.h +++ b/app/backend/computermanager.h @@ -249,6 +249,8 @@ class ComputerManager : public QObject public: explicit ComputerManager(QObject *parent = nullptr); + virtual ~ComputerManager(); + Q_INVOKABLE void startPolling(); Q_INVOKABLE void stopPollingAsync();