From b06b6a9da34d8e6d127ee7f595750790f2f31404 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 11 May 2014 20:59:57 +0100 Subject: [PATCH] Store a strong reference to a playlist pointer so it will not be destroyed before the postCommitHook finishes --- ...baseCommand_SetDynamicPlaylistRevision.cpp | 24 +++++++------------ ...tabaseCommand_SetDynamicPlaylistRevision.h | 6 ++--- .../playlist/dynamic/DynamicPlaylist.cpp | 4 ++-- 3 files changed, 13 insertions(+), 21 deletions(-) diff --git a/src/libtomahawk/database/DatabaseCommand_SetDynamicPlaylistRevision.cpp b/src/libtomahawk/database/DatabaseCommand_SetDynamicPlaylistRevision.cpp index 577a17aa5..f9a6f8221 100644 --- a/src/libtomahawk/database/DatabaseCommand_SetDynamicPlaylistRevision.cpp +++ b/src/libtomahawk/database/DatabaseCommand_SetDynamicPlaylistRevision.cpp @@ -108,27 +108,21 @@ DatabaseCommand_SetDynamicPlaylistRevision::postCommitHook() tLog() << "Postcommitting this playlist:" << playlistguid() << source().isNull(); // private, but we are a friend. will recall itself in its own thread: - DynamicPlaylist* rawPl = 0; dynplaylist_ptr playlist = source()->dbCollection()->autoPlaylist( playlistguid() ); if ( playlist.isNull() ) { playlist = source()->dbCollection()->station( playlistguid() ); } - if ( !playlist.isNull() ) - { - rawPl = playlist.data(); - } - else + if ( playlist.isNull() && !m_playlist.isNull() ) { // if it's neither an auto or station, it must not be auto-loaded, so we MUST have been told about it directly - rawPl = m_playlist; + playlist = m_playlist; } - if ( !rawPl ) + if ( playlist.isNull() ) { tLog() << "Got null playlist with guid:" << playlistguid() << "from source and collection:" << source()->friendlyName() << source()->dbCollection()->name() << "and mode is static?:" << (m_mode == Static); -// Q_ASSERT( false ); return; } @@ -139,13 +133,13 @@ DatabaseCommand_SetDynamicPlaylistRevision::postCommitHook() controlMap << v.toMap(); if ( m_mode == OnDemand ) - rawPl->setRevision( newrev(), + playlist->setRevision( newrev(), true, // this *is* the newest revision so far m_type, controlMap, m_applied ); else - rawPl->setRevision( newrev(), + playlist->setRevision( newrev(), orderedentriesguids, m_previous_rev_orderedguids, m_type, @@ -157,13 +151,13 @@ DatabaseCommand_SetDynamicPlaylistRevision::postCommitHook() else { if ( m_mode == OnDemand ) - rawPl->setRevision( newrev(), + playlist->setRevision( newrev(), true, // this *is* the newest revision so far m_type, m_controls, m_applied ); else - rawPl->setRevision( newrev(), + playlist->setRevision( newrev(), orderedentriesguids, m_previous_rev_orderedguids, m_type, @@ -269,9 +263,9 @@ DatabaseCommand_SetDynamicPlaylistRevision::exec( DatabaseImpl* lib ) } void -DatabaseCommand_SetDynamicPlaylistRevision::setPlaylist( DynamicPlaylist* pl ) +DatabaseCommand_SetDynamicPlaylistRevision::setPlaylist( QWeakPointer pl ) { - m_playlist = pl; + m_playlist = pl.toStrongRef(); } } diff --git a/src/libtomahawk/database/DatabaseCommand_SetDynamicPlaylistRevision.h b/src/libtomahawk/database/DatabaseCommand_SetDynamicPlaylistRevision.h index d94cc1daf..2dfa05663 100644 --- a/src/libtomahawk/database/DatabaseCommand_SetDynamicPlaylistRevision.h +++ b/src/libtomahawk/database/DatabaseCommand_SetDynamicPlaylistRevision.h @@ -76,8 +76,7 @@ public: void setType( const QString& type ) { m_type = type; } void setMode( int mode ) { m_mode = (GeneratorMode)mode; } - // TODO: Pass wptr here, so we can get a strong reference again - void setPlaylist( DynamicPlaylist* pl ); // raw pointer b/c we don't have the shared pointer from inside the shared pointer + void setPlaylist( QWeakPointer pl ); // raw pointer b/c we don't have the shared pointer from inside the shared pointer private: QString m_type; @@ -85,8 +84,7 @@ private: QList< dyncontrol_ptr > m_controls; QList< QVariant > m_controlsV; - // ARG i hate sharedpointers sometimes - DynamicPlaylist* m_playlist; // Only used if setting revision of a non-autoloaded playlist, as those aren't able to be looked up by guid + QSharedPointer m_playlist; // Only used if setting revision of a non-autoloaded playlist, as those aren't able to be looked up by guid }; } diff --git a/src/libtomahawk/playlist/dynamic/DynamicPlaylist.cpp b/src/libtomahawk/playlist/dynamic/DynamicPlaylist.cpp index 03a6a0c02..47a4ce96b 100644 --- a/src/libtomahawk/playlist/dynamic/DynamicPlaylist.cpp +++ b/src/libtomahawk/playlist/dynamic/DynamicPlaylist.cpp @@ -242,7 +242,7 @@ DynamicPlaylist::createNewRevision( const QString& newrev, Static, controls ); if ( !d->autoLoad ) - cmd->setPlaylist( this ); + cmd->setPlaylist( d->weakSelf ); Database::instance()->enqueue( Tomahawk::dbcmd_ptr( cmd ) ); } @@ -278,7 +278,7 @@ DynamicPlaylist::createNewRevision( const QString& newrev, OnDemand, controls ); if ( !d->autoLoad ) - cmd->setPlaylist( this ); + cmd->setPlaylist( d->weakSelf ); Database::instance()->enqueue( Tomahawk::dbcmd_ptr( cmd ) ); }