From 4813698a9afecc0536453c99755f66e52e13bcd4 Mon Sep 17 00:00:00 2001
From: Dominik Schmidt <domme@tomahawk-player.org>
Date: Thu, 18 Feb 2016 00:51:02 +0100
Subject: [PATCH] Allow creating basic data types from QtConcurrent::run

When QObjects are created from QtConcurrent::run they live in a pooled thread that doesn't handle events/signals/slots properly
---
 src/libtomahawk/Album.cpp     |  2 ++
 src/libtomahawk/Artist.cpp    |  2 ++
 src/libtomahawk/Query.cpp     |  2 ++
 src/libtomahawk/Result.cpp    | 17 +++++++++++------
 src/libtomahawk/Track.cpp     |  2 ++
 src/libtomahawk/TrackData.cpp |  8 ++++++--
 6 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/src/libtomahawk/Album.cpp b/src/libtomahawk/Album.cpp
index d86588592..cdbcb42c5 100644
--- a/src/libtomahawk/Album.cpp
+++ b/src/libtomahawk/Album.cpp
@@ -33,6 +33,7 @@
 
 #include <QReadWriteLock>
 #include <QPixmapCache>
+#include <QCoreApplication>
 
 using namespace Tomahawk;
 
@@ -75,6 +76,7 @@ Album::get( const Tomahawk::artist_ptr& artist, const QString& name, bool autoCr
     }
 
     album_ptr album = album_ptr( new Album( name, artist ), &Album::deleteLater );
+    album->moveToThread( QCoreApplication::instance()->thread() );
     album->setWeakRef( album.toWeakRef() );
     album->loadId( autoCreate );
     s_albumsByName.insert( key, album );
diff --git a/src/libtomahawk/Artist.cpp b/src/libtomahawk/Artist.cpp
index 8922361fc..d81a59237 100644
--- a/src/libtomahawk/Artist.cpp
+++ b/src/libtomahawk/Artist.cpp
@@ -36,6 +36,7 @@
 
 #include <QReadWriteLock>
 #include <QPixmapCache>
+#include <QCoreApplication>
 
 using namespace Tomahawk;
 
@@ -109,6 +110,7 @@ Artist::get( unsigned int id, const QString& name )
     }
 
     artist_ptr a = artist_ptr( new Artist( id, name ), &Artist::deleteLater );
+    a->moveToThread( QCoreApplication::instance()->thread() );
     a->setWeakRef( a.toWeakRef() );
     s_artistsByName.insert( key, a );
 
diff --git a/src/libtomahawk/Query.cpp b/src/libtomahawk/Query.cpp
index 9d62206ff..057427d37 100644
--- a/src/libtomahawk/Query.cpp
+++ b/src/libtomahawk/Query.cpp
@@ -33,6 +33,7 @@
 
 #include <QtAlgorithms>
 #include <QDebug>
+#include <QCoreApplication>
 
 using namespace Tomahawk;
 
@@ -47,6 +48,7 @@ Query::get( const QString& artist, const QString& track, const QString& album, c
         autoResolve = false;
 
     query_ptr q = query_ptr( new Query( Track::get( artist, track, album ), qid, autoResolve ), &QObject::deleteLater );
+    q->moveToThread( QCoreApplication::instance()->thread() );
     q->setWeakRef( q.toWeakRef() );
 
     if ( autoResolve )
diff --git a/src/libtomahawk/Result.cpp b/src/libtomahawk/Result.cpp
index 04f5587de..477b7192a 100644
--- a/src/libtomahawk/Result.cpp
+++ b/src/libtomahawk/Result.cpp
@@ -35,6 +35,8 @@
 #include "Track.h"
 #include "Typedefs.h"
 
+#include <QCoreApplication>
+
 using namespace Tomahawk;
 
 static QHash< QString, result_wptr > s_results;
@@ -69,6 +71,7 @@ Result::get( const QString& url, const track_ptr& track )
     }
 
     result_ptr r = result_ptr( new Result( url, track ), &Result::deleteLater );
+    r->moveToThread( QCoreApplication::instance()->thread() );
     r->setWeakRef( r.toWeakRef() );
     s_results.insert( url, r );
 
@@ -132,21 +135,25 @@ Result::deleteLater()
 void
 Result::onResolverRemoved( Tomahawk::Resolver* resolver )
 {
-    QMutexLocker lock( &m_mutex );
+    m_mutex.lock();
 
     if ( m_resolver.data() == resolver )
     {
         m_resolver = 0;
+        m_mutex.unlock();
+
         emit statusChanged();
     }
+    else
+    {
+        m_mutex.unlock();
+    }
 }
 
 
 collection_ptr
 Result::resolvedByCollection() const
 {
-    QMutexLocker lock( &m_mutex );
-
     return m_collection;
 }
 
@@ -323,11 +330,9 @@ Result::onOffline()
 
 
 void
-Result::setResolvedByCollection( const Tomahawk::collection_ptr& collection , bool emitOnlineEvents )
+Result::setResolvedByCollection( const Tomahawk::collection_ptr& collection, bool emitOnlineEvents )
 {
-    m_mutex.lock();
     m_collection = collection;
-    m_mutex.unlock();
 
     if ( emitOnlineEvents )
     {
diff --git a/src/libtomahawk/Track.cpp b/src/libtomahawk/Track.cpp
index 26dd6acf4..51a7596da 100644
--- a/src/libtomahawk/Track.cpp
+++ b/src/libtomahawk/Track.cpp
@@ -37,6 +37,7 @@
 #include <QtAlgorithms>
 #include <QDateTime>
 #include <QReadWriteLock>
+#include <QCoreApplication>
 
 
 using namespace Tomahawk;
@@ -92,6 +93,7 @@ Track::get( const QString& artist, const QString& track, const QString& album, c
     }
 
     track_ptr t = track_ptr( new Track( artist, track, album, albumArtist, duration, composer, albumpos, discnumber ), &Track::deleteLater );
+    t->moveToThread( QCoreApplication::instance()->thread() );
     t->setWeakRef( t.toWeakRef() );
     s_tracksByName.insert( key, t );
 
diff --git a/src/libtomahawk/TrackData.cpp b/src/libtomahawk/TrackData.cpp
index dc2cdbf78..30656560e 100644
--- a/src/libtomahawk/TrackData.cpp
+++ b/src/libtomahawk/TrackData.cpp
@@ -19,8 +19,7 @@
 
 #include "TrackData.h"
 
-#include <QtAlgorithms>
-#include <QReadWriteLock>
+
 
 #include "audio/AudioEngine.h"
 #include "collection/Collection.h"
@@ -41,6 +40,10 @@
 #include "PlaylistEntry.h"
 #include "SourceList.h"
 
+#include <QtAlgorithms>
+#include <QReadWriteLock>
+#include <QCoreApplication>
+
 using namespace Tomahawk;
 
 QHash< QString, trackdata_wptr > TrackData::s_trackDatasByName = QHash< QString, trackdata_wptr >();
@@ -84,6 +87,7 @@ TrackData::get( unsigned int id, const QString& artist, const QString& track )
     }
 
     trackdata_ptr t = trackdata_ptr( new TrackData( id, artist, track ), &TrackData::deleteLater );
+    t->moveToThread( QCoreApplication::instance()->thread() );
     t->setWeakRef( t.toWeakRef() );
     s_trackDatasByName.insert( key, t );