diff --git a/src/libtomahawk/Source.cpp b/src/libtomahawk/Source.cpp index 98d6c3290..8295748d3 100644 --- a/src/libtomahawk/Source.cpp +++ b/src/libtomahawk/Source.cpp @@ -477,6 +477,11 @@ Source::playlistInterface() return m_playlistInterface; } +QSharedPointer Source::acquireLock() +{ + return QSharedPointer( new QMutexLocker( &m_mutex ) ); +} + void Source::onPlaybackStarted( const Tomahawk::track_ptr& track, unsigned int duration ) diff --git a/src/libtomahawk/Source.h b/src/libtomahawk/Source.h index 7273bc6b9..6db8affcd 100644 --- a/src/libtomahawk/Source.h +++ b/src/libtomahawk/Source.h @@ -102,6 +102,8 @@ public: Tomahawk::playlistinterface_ptr playlistInterface(); + QSharedPointer acquireLock(); + signals: void syncedWithDatabase(); void synced(); @@ -175,6 +177,7 @@ private: QString m_lastCmdGuid; mutable QMutex m_cmdMutex; QMutex m_setControlConnectionMutex; + QMutex m_mutex; Tomahawk::playlistinterface_ptr m_playlistInterface; }; diff --git a/src/libtomahawk/network/ControlConnection.cpp b/src/libtomahawk/network/ControlConnection.cpp index 880626edc..69014c631 100644 --- a/src/libtomahawk/network/ControlConnection.cpp +++ b/src/libtomahawk/network/ControlConnection.cpp @@ -100,6 +100,7 @@ ControlConnection::setup() // setup source and remote collection for this peer m_source = SourceList::instance()->get( id(), friendlyName, true ); + QSharedPointer locker = m_source->acquireLock(); if ( m_source->setControlConnection( this ) ) { // We are the new ControlConnection for this source @@ -129,13 +130,18 @@ ControlConnection::setup() void ControlConnection::registerSource() { - qDebug() << Q_FUNC_INFO << m_source->id(); - Source* source = (Source*) sender(); - Q_UNUSED( source ) - Q_ASSERT( source == m_source.data() ); + QSharedPointer locker = m_source->acquireLock(); + // Only continue if we are still the ControlConnection associated with this source. + if ( m_source->controlConnection() == this ) + { + qDebug() << Q_FUNC_INFO << m_source->id(); + Source* source = (Source*) sender(); + Q_UNUSED( source ) + Q_ASSERT( source == m_source.data() ); - m_registered = true; - setupDbSyncConnection(); + m_registered = true; + setupDbSyncConnection(); + } }