diff --git a/src/libtomahawk/utils/Closure.cpp b/src/libtomahawk/utils/Closure.cpp index 8fec43b97..daa1003b2 100644 --- a/src/libtomahawk/utils/Closure.cpp +++ b/src/libtomahawk/utils/Closure.cpp @@ -17,9 +17,15 @@ */ #include "Closure.h" +#include namespace _detail { +static bool on_this_thread(QObject* obj) +{ + return QCoreApplication::instance()->thread() == obj->thread(); +} + Closure::Closure(QObject* sender, const char* signal, QObject* receiver, @@ -28,9 +34,10 @@ Closure::Closure(QObject* sender, const ClosureArgumentWrapper* val1, const ClosureArgumentWrapper* val2, const ClosureArgumentWrapper* val3) - : QObject(receiver), + : QObject(on_this_thread(receiver) ? receiver : 0), callback_(NULL), autoDelete_(true), + outOfThreadReceiver_(on_this_thread(receiver) ? 0 : receiver ), val0_(val0), val1_(val1), val2_(val2), @@ -78,7 +85,7 @@ void Closure::Invoked() { callback_(); } else { slot_.invoke( - parent(), + parent() ? parent() : outOfThreadReceiver_, val0_ ? val0_->arg() : QGenericArgument(), val1_ ? val1_->arg() : QGenericArgument(), val2_ ? val2_->arg() : QGenericArgument(), diff --git a/src/libtomahawk/utils/Closure.h b/src/libtomahawk/utils/Closure.h index 591712358..de47502bc 100644 --- a/src/libtomahawk/utils/Closure.h +++ b/src/libtomahawk/utils/Closure.h @@ -89,6 +89,7 @@ class DLLEXPORT Closure : public QObject, boost::noncopyable { QMetaMethod slot_; std::tr1::function callback_; bool autoDelete_; + QObject* outOfThreadReceiver_; boost::scoped_ptr val0_; boost::scoped_ptr val1_;