mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-08-05 13:47:26 +02:00
Do not try to quit DatabaseWorkerThreads where we have never started the event loop
This commit is contained in:
@@ -143,11 +143,17 @@ Database::~Database()
|
|||||||
delete m_idWorker;
|
delete m_idWorker;
|
||||||
|
|
||||||
if ( m_workerRW )
|
if ( m_workerRW )
|
||||||
|
{
|
||||||
|
// Ensure event loop was started so quit() has any effect.
|
||||||
|
m_workerRW->waitForEventLoopStart();
|
||||||
m_workerRW.data()->quit();
|
m_workerRW.data()->quit();
|
||||||
|
}
|
||||||
foreach ( QPointer< DatabaseWorkerThread > workerThread, m_workerThreads )
|
foreach ( QPointer< DatabaseWorkerThread > workerThread, m_workerThreads )
|
||||||
{
|
{
|
||||||
if ( workerThread && workerThread.data()->worker() )
|
// Ensure event loop was started so quit() has any effect.
|
||||||
workerThread.data()->quit();
|
workerThread->waitForEventLoopStart();
|
||||||
|
// If event loop already was killed, the following is just a no-op.
|
||||||
|
workerThread->quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( m_workerRW )
|
if ( m_workerRW )
|
||||||
|
@@ -46,6 +46,7 @@ DatabaseWorkerThread::DatabaseWorkerThread( Database* db, bool mutates )
|
|||||||
, m_db( db )
|
, m_db( db )
|
||||||
, m_mutates( mutates )
|
, m_mutates( mutates )
|
||||||
{
|
{
|
||||||
|
m_startupMutex.lock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -54,6 +55,7 @@ DatabaseWorkerThread::run()
|
|||||||
{
|
{
|
||||||
tDebug() << Q_FUNC_INFO << "DatabaseWorkerThread starting...";
|
tDebug() << Q_FUNC_INFO << "DatabaseWorkerThread starting...";
|
||||||
m_worker = QPointer< DatabaseWorker >( new DatabaseWorker( m_db, m_mutates ) );
|
m_worker = QPointer< DatabaseWorker >( new DatabaseWorker( m_db, m_mutates ) );
|
||||||
|
m_startupMutex.unlock();
|
||||||
exec();
|
exec();
|
||||||
tDebug() << Q_FUNC_INFO << "DatabaseWorkerThread finishing...";
|
tDebug() << Q_FUNC_INFO << "DatabaseWorkerThread finishing...";
|
||||||
if ( m_worker )
|
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 )
|
DatabaseWorker::DatabaseWorker( Database* db, bool mutates )
|
||||||
: QObject()
|
: QObject()
|
||||||
, m_db( db )
|
, m_db( db )
|
||||||
|
@@ -70,6 +70,13 @@ public:
|
|||||||
|
|
||||||
QPointer< DatabaseWorker > worker() const;
|
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:
|
protected:
|
||||||
void run();
|
void run();
|
||||||
|
|
||||||
@@ -77,6 +84,11 @@ private:
|
|||||||
QPointer< DatabaseWorker > m_worker;
|
QPointer< DatabaseWorker > m_worker;
|
||||||
Database* m_db;
|
Database* m_db;
|
||||||
bool m_mutates;
|
bool m_mutates;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Locks until we've started the event loop.
|
||||||
|
*/
|
||||||
|
QMutex m_startupMutex;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user