From 696ba91a79557c6126bed15ebcb5d7ac2f40bcd3 Mon Sep 17 00:00:00 2001 From: Jeff Mitchell Date: Thu, 17 Feb 2011 12:43:56 -0500 Subject: [PATCH] Hopefully solve crashing on exit during scanning --- src/CMakeLists.txt | 1 + src/libtomahawk/utils/tomahawkutils.h | 20 +++++++++++++++++++- src/musicscanner.cpp | 19 +++++++++++++++++++ src/scanmanager.cpp | 22 ++++++++++++++++++---- 4 files changed, 57 insertions(+), 5 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6020d3c54..b2b261cfc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -119,6 +119,7 @@ INCLUDE_DIRECTORIES( topbar utils libtomahawk + libtomahawk/utils mac ../alsa-playback diff --git a/src/libtomahawk/utils/tomahawkutils.h b/src/libtomahawk/utils/tomahawkutils.h index 7ad579a39..1696dbd00 100644 --- a/src/libtomahawk/utils/tomahawkutils.h +++ b/src/libtomahawk/utils/tomahawkutils.h @@ -3,6 +3,7 @@ #include "dllmacro.h" #include +#include #define RESPATH ":/data/" @@ -41,7 +42,24 @@ namespace TomahawkUtils private: JDnsShared* m_dnsShared; JDnsSharedRequest* m_dnsSharedRequest; - }; + }; + + class DLLEXPORT Sleep : public QThread + { + public: + static void sleep(unsigned long secs) + { + QThread::sleep(secs); + } + static void msleep(unsigned long msecs) + { + QThread::msleep(msecs); + } + static void usleep(unsigned long usecs) + { + QThread::usleep(usecs); + } + }; DLLEXPORT QDir appConfigDir(); DLLEXPORT QDir appDataDir(); diff --git a/src/musicscanner.cpp b/src/musicscanner.cpp index 235467fca..ef9bde29f 100644 --- a/src/musicscanner.cpp +++ b/src/musicscanner.cpp @@ -34,6 +34,25 @@ MusicScanner::MusicScanner( const QString& dir, quint32 bs ) MusicScanner::~MusicScanner() { qDebug() << Q_FUNC_INFO; + if( m_dirListerThreadController ) + { + m_dirListerThreadController->quit(); + + while( !m_dirListerThreadController->isFinished() ) + { + QCoreApplication::processEvents( QEventLoop::AllEvents, 200 ); + TomahawkUtils::Sleep::msleep(100); + } + + if( m_dirLister ) + { + delete m_dirLister; + m_dirLister = 0; + } + + delete m_dirListerThreadController; + m_dirListerThreadController = 0; + } } void diff --git a/src/scanmanager.cpp b/src/scanmanager.cpp index 16a74fd10..29ee7383d 100644 --- a/src/scanmanager.cpp +++ b/src/scanmanager.cpp @@ -2,9 +2,11 @@ #include #include +#include #include "musicscanner.h" #include "tomahawksettings.h" +#include "tomahawkutils.h" ScanManager* ScanManager::s_instance = 0; @@ -30,14 +32,26 @@ ScanManager::ScanManager( QObject* parent ) ScanManager::~ScanManager() { qDebug() << Q_FUNC_INFO; - s_instance = 0; + if( m_musicScannerThreadController ) { m_musicScannerThreadController->quit(); - m_musicScannerThreadController->deleteLater(); + + while( !m_musicScannerThreadController->isFinished() ) + { + QCoreApplication::processEvents( QEventLoop::AllEvents, 200 ); + TomahawkUtils::Sleep::msleep(100); + } + + if( m_scanner ) + { + delete m_scanner; + m_scanner = 0; + } + + delete m_musicScannerThreadController; + m_musicScannerThreadController = 0; } - m_musicScannerThreadController = 0; - m_scanner = 0; }