diff --git a/src/libtomahawk/database/Database.cpp b/src/libtomahawk/database/Database.cpp index e792ee86c..f880a63f2 100644 --- a/src/libtomahawk/database/Database.cpp +++ b/src/libtomahawk/database/Database.cpp @@ -143,11 +143,17 @@ Database::~Database() delete m_idWorker; if ( m_workerRW ) + { + // Ensure event loop was started so quit() has any effect. + m_workerRW->waitForEventLoopStart(); m_workerRW.data()->quit(); + } foreach ( QPointer< DatabaseWorkerThread > workerThread, m_workerThreads ) { - if ( workerThread && workerThread.data()->worker() ) - workerThread.data()->quit(); + // Ensure event loop was started so quit() has any effect. + workerThread->waitForEventLoopStart(); + // If event loop already was killed, the following is just a no-op. + workerThread->quit(); } if ( m_workerRW ) diff --git a/src/libtomahawk/database/DatabaseWorker.cpp b/src/libtomahawk/database/DatabaseWorker.cpp index 071e8638e..d87442841 100644 --- a/src/libtomahawk/database/DatabaseWorker.cpp +++ b/src/libtomahawk/database/DatabaseWorker.cpp @@ -46,6 +46,7 @@ DatabaseWorkerThread::DatabaseWorkerThread( Database* db, bool mutates ) , m_db( db ) , m_mutates( mutates ) { + m_startupMutex.lock(); } @@ -54,6 +55,7 @@ DatabaseWorkerThread::run() { tDebug() << Q_FUNC_INFO << "DatabaseWorkerThread starting..."; m_worker = QPointer< DatabaseWorker >( new DatabaseWorker( m_db, m_mutates ) ); + m_startupMutex.unlock(); exec(); tDebug() << Q_FUNC_INFO << "DatabaseWorkerThread finishing..."; if ( m_worker ) @@ -73,6 +75,15 @@ DatabaseWorkerThread::worker() const } +void +DatabaseWorkerThread::waitForEventLoopStart() +{ + m_startupMutex.lock(); + // no-op just to block on locking. + m_startupMutex.unlock(); +} + + DatabaseWorker::DatabaseWorker( Database* db, bool mutates ) : QObject() , m_db( db ) diff --git a/src/libtomahawk/database/DatabaseWorker.h b/src/libtomahawk/database/DatabaseWorker.h index 2de81d5e0..2198adc04 100644 --- a/src/libtomahawk/database/DatabaseWorker.h +++ b/src/libtomahawk/database/DatabaseWorker.h @@ -70,6 +70,13 @@ public: QPointer< DatabaseWorker > worker() const; + /** + * Waits until the event loop was started. + * + * Blocking, i.e. do not call from within the DatabaseWorkerThread thread. + */ + void waitForEventLoopStart(); + protected: void run(); @@ -77,6 +84,11 @@ private: QPointer< DatabaseWorker > m_worker; Database* m_db; bool m_mutates; + + /** + * Locks until we've started the event loop. + */ + QMutex m_startupMutex; }; }