summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUwe Klotz <uklotz@mixxx.org>2018-12-28 12:07:06 +0100
committerUwe Klotz <uklotz@mixxx.org>2018-12-28 12:12:58 +0100
commitdcf6301b457ebe60c1a08c9b3a433d304ef34e6a (patch)
tree3094582bfd204ddf8947ce1ba9751cc0f1d2d621
parent78cef8f73aacf923bbc2e8058c6d2eaa9c9607d6 (diff)
Stop worker threads before exiting
-rw-r--r--src/analyzer/trackanalysisscheduler.cpp2
-rw-r--r--src/library/analysisfeature.cpp7
-rw-r--r--src/library/analysisfeature.h4
-rw-r--r--src/library/library.cpp8
-rw-r--r--src/library/library.h2
-rw-r--r--src/mixer/playermanager.cpp5
-rw-r--r--src/mixxx.cpp3
7 files changed, 26 insertions, 5 deletions
diff --git a/src/analyzer/trackanalysisscheduler.cpp b/src/analyzer/trackanalysisscheduler.cpp
index d88809b1c4..cb48a52e83 100644
--- a/src/analyzer/trackanalysisscheduler.cpp
+++ b/src/analyzer/trackanalysisscheduler.cpp
@@ -264,9 +264,11 @@ bool TrackAnalysisScheduler::submitNextTrack(Worker* worker) {
void TrackAnalysisScheduler::stop() {
kLogger.debug() << "Stopping";
+ m_queuedTrackIds.clear();
for (auto& worker: m_workers) {
worker.stopThread();
}
+ m_workers.clear();
}
TrackPointer TrackAnalysisScheduler::loadTrackById(TrackId trackId) {
diff --git a/src/library/analysisfeature.cpp b/src/library/analysisfeature.cpp
index 9d9e77e42f..83de1a8b62 100644
--- a/src/library/analysisfeature.cpp
+++ b/src/library/analysisfeature.cpp
@@ -54,9 +54,10 @@ AnalysisFeature::AnalysisFeature(
setTitleDefault();
}
-AnalysisFeature::~AnalysisFeature() {
- // TODO(XXX) delete these
- //delete m_pLibraryTableModel;
+void AnalysisFeature::stop() {
+ if (m_pTrackAnalysisScheduler) {
+ m_pTrackAnalysisScheduler->stop();
+ }
}
void AnalysisFeature::setTitleDefault() {
diff --git a/src/library/analysisfeature.h b/src/library/analysisfeature.h
index 29d97f7be2..89690d2702 100644
--- a/src/library/analysisfeature.h
+++ b/src/library/analysisfeature.h
@@ -26,7 +26,9 @@ class AnalysisFeature : public LibraryFeature {
public:
AnalysisFeature(Library* parent,
UserSettingsPointer pConfig);
- virtual ~AnalysisFeature();
+ ~AnalysisFeature() override = default;
+
+ void stop();
QVariant title();
QIcon getIcon();
diff --git a/src/library/library.cpp b/src/library/library.cpp
index 8a07715b7c..d95416941d 100644
--- a/src/library/library.cpp
+++ b/src/library/library.cpp
@@ -211,6 +211,14 @@ Library::~Library() {
delete m_pTrackCollection;
}
+void Library::stopFeatures() {
+ if (m_pAnalysisFeature) {
+ m_pAnalysisFeature->stop();
+ m_pAnalysisFeature = nullptr;
+ }
+ m_scanner.slotCancel();
+}
+
void Library::bindSidebarWidget(WLibrarySidebar* pSidebarWidget) {
m_pLibraryControl->bindSidebarWidget(pSidebarWidget);
diff --git a/src/library/library.h b/src/library/library.h
index 70b51e1d7d..fa686a1406 100644
--- a/src/library/library.h
+++ b/src/library/library.h
@@ -51,6 +51,8 @@ class Library: public QObject,
RecordingManager* pRecordingManager);
~Library() override;
+ void stopFeatures();
+
mixxx::DbConnectionPoolPtr dbConnectionPool() const {
return m_pDbConnectionPool;
}
diff --git a/src/mixer/playermanager.cpp b/src/mixer/playermanager.cpp
index 3a3775b500..d2b7bb4d56 100644
--- a/src/mixer/playermanager.cpp
+++ b/src/mixer/playermanager.cpp
@@ -103,7 +103,10 @@ PlayerManager::~PlayerManager() {
delete m_pCONumMicrophones;
delete m_pCONumAuxiliaries;
- m_pTrackAnalysisScheduler.reset();
+ if (m_pTrackAnalysisScheduler) {
+ m_pTrackAnalysisScheduler->stop();
+ m_pTrackAnalysisScheduler.reset();
+ }
}
void PlayerManager::bindToLibrary(Library* pLibrary) {
diff --git a/src/mixxx.cpp b/src/mixxx.cpp
index 69a03c454c..438f4ed0b9 100644
--- a/src/mixxx.cpp
+++ b/src/mixxx.cpp
@@ -603,6 +603,9 @@ void MixxxMainWindow::finalize() {
qWarning() << "WMainMenuBar was not deleted by our sendPostedEvents trick.";
}
+ qDebug() << t.elapsed(false).debugMillisWithUnit() << "stopping pending Library tasks";
+ m_pLibrary->stopFeatures();
+
// SoundManager depend on Engine and Config
qDebug() << t.elapsed(false).debugMillisWithUnit() << "deleting SoundManager";
delete m_pSoundManager;