Remove the pointless CreateInThread method from BackgroundThread and instead move objects to the right thread after creation.
This commit is contained in:
parent
62daf29ec8
commit
d980fd5ff8
@ -16,41 +16,13 @@
|
|||||||
|
|
||||||
#include "backgroundthread.h"
|
#include "backgroundthread.h"
|
||||||
|
|
||||||
int BackgroundThreadBase::CreateInThreadEvent::sEventType = -1;
|
|
||||||
|
|
||||||
BackgroundThreadBase::BackgroundThreadBase(QObject *parent)
|
BackgroundThreadBase::BackgroundThreadBase(QObject *parent)
|
||||||
: QThread(parent),
|
: QThread(parent),
|
||||||
io_priority_(IOPRIO_CLASS_NONE),
|
io_priority_(IOPRIO_CLASS_NONE),
|
||||||
cpu_priority_(InheritPriority),
|
cpu_priority_(InheritPriority)
|
||||||
object_creator_(NULL)
|
|
||||||
{
|
|
||||||
if (CreateInThreadEvent::sEventType == -1)
|
|
||||||
CreateInThreadEvent::sEventType = QEvent::registerEventType();
|
|
||||||
}
|
|
||||||
|
|
||||||
BackgroundThreadBase::CreateInThreadEvent::CreateInThreadEvent(CreateInThreadRequest *req)
|
|
||||||
: QEvent(QEvent::Type(sEventType)),
|
|
||||||
req_(req)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BackgroundThreadBase::ObjectCreator::event(QEvent* e) {
|
|
||||||
if (e->type() != CreateInThreadEvent::sEventType)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Create the object, parented to this object so it gets destroyed when the
|
|
||||||
// thread ends.
|
|
||||||
CreateInThreadRequest* req = static_cast<CreateInThreadEvent*>(e)->req_;
|
|
||||||
req->object_ = req->meta_object_.newInstance(Q_ARG(QObject*, this));
|
|
||||||
|
|
||||||
// Wake up the calling thread
|
|
||||||
QMutexLocker l(&req->mutex_);
|
|
||||||
req->wait_condition_.wakeAll();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int BackgroundThreadBase::SetIOPriority() {
|
int BackgroundThreadBase::SetIOPriority() {
|
||||||
#ifdef Q_OS_LINUX
|
#ifdef Q_OS_LINUX
|
||||||
return syscall(SYS_ioprio_set, IOPRIO_WHO_PROCESS, gettid(),
|
return syscall(SYS_ioprio_set, IOPRIO_WHO_PROCESS, gettid(),
|
||||||
|
@ -69,41 +69,10 @@ class BackgroundThreadBase : public QThread {
|
|||||||
|
|
||||||
virtual void Start(bool block = false);
|
virtual void Start(bool block = false);
|
||||||
|
|
||||||
// Creates a new QObject in this thread synchronously.
|
|
||||||
// The class T needs to have a Q_INVOKABLE constructor that takes a single
|
|
||||||
// QObject* argument.
|
|
||||||
template <typename T>
|
|
||||||
T* CreateInThread();
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void Initialised();
|
void Initialised();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
struct CreateInThreadRequest {
|
|
||||||
CreateInThreadRequest(const QMetaObject& meta_object)
|
|
||||||
: meta_object_(meta_object), object_(NULL) {}
|
|
||||||
|
|
||||||
const QMetaObject& meta_object_;
|
|
||||||
QObject* object_;
|
|
||||||
|
|
||||||
QWaitCondition wait_condition_;
|
|
||||||
QMutex mutex_;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CreateInThreadEvent : public QEvent {
|
|
||||||
CreateInThreadEvent(CreateInThreadRequest* req);
|
|
||||||
|
|
||||||
static int sEventType;
|
|
||||||
|
|
||||||
CreateInThreadRequest* req_;
|
|
||||||
};
|
|
||||||
|
|
||||||
class ObjectCreator : public QObject {
|
|
||||||
public:
|
|
||||||
bool event(QEvent *);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
int SetIOPriority();
|
int SetIOPriority();
|
||||||
static int gettid();
|
static int gettid();
|
||||||
|
|
||||||
@ -119,8 +88,6 @@ class BackgroundThreadBase : public QThread {
|
|||||||
|
|
||||||
QWaitCondition started_wait_condition_;
|
QWaitCondition started_wait_condition_;
|
||||||
QMutex started_wait_condition_mutex_;
|
QMutex started_wait_condition_mutex_;
|
||||||
|
|
||||||
ObjectCreator* object_creator_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// This is the templated class that stores and returns the worker object.
|
// This is the templated class that stores and returns the worker object.
|
||||||
@ -165,24 +132,6 @@ class BackgroundThreadFactoryImplementation : public BackgroundThreadFactory<Int
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
T* BackgroundThreadBase::CreateInThread() {
|
|
||||||
// Create the request and lock it.
|
|
||||||
CreateInThreadRequest req(T::staticMetaObject);
|
|
||||||
QMutexLocker l(&req.mutex_);
|
|
||||||
|
|
||||||
// Post an event to the thread. It will create the object and signal the
|
|
||||||
// wait condition. Ownership of the event is transferred to Qt.
|
|
||||||
CreateInThreadEvent* event = new CreateInThreadEvent(&req);
|
|
||||||
QCoreApplication::postEvent(object_creator_, event);
|
|
||||||
|
|
||||||
req.wait_condition_.wait(&req.mutex_);
|
|
||||||
|
|
||||||
return static_cast<T*>(req.object_);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename InterfaceType>
|
template <typename InterfaceType>
|
||||||
BackgroundThread<InterfaceType>::BackgroundThread(QObject *parent)
|
BackgroundThread<InterfaceType>::BackgroundThread(QObject *parent)
|
||||||
: BackgroundThreadBase(parent)
|
: BackgroundThreadBase(parent)
|
||||||
@ -216,7 +165,6 @@ void BackgroundThreadImplementation<InterfaceType, DerivedType>::run() {
|
|||||||
this->SetIOPriority();
|
this->SetIOPriority();
|
||||||
|
|
||||||
this->worker_.reset(new DerivedType);
|
this->worker_.reset(new DerivedType);
|
||||||
this->object_creator_ = new BackgroundThreadBase::ObjectCreator;
|
|
||||||
|
|
||||||
{
|
{
|
||||||
// Tell the calling thread that we've initialised the worker.
|
// Tell the calling thread that we've initialised the worker.
|
||||||
@ -227,7 +175,6 @@ void BackgroundThreadImplementation<InterfaceType, DerivedType>::run() {
|
|||||||
emit this->Initialised();
|
emit this->Initialised();
|
||||||
QThread::exec();
|
QThread::exec();
|
||||||
|
|
||||||
delete this->object_creator_;
|
|
||||||
this->worker_.reset();
|
this->worker_.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,8 +40,9 @@ ConnectedDevice::ConnectedDevice(const QUrl& url, DeviceLister* lister,
|
|||||||
qDebug() << __PRETTY_FUNCTION__;
|
qDebug() << __PRETTY_FUNCTION__;
|
||||||
|
|
||||||
// Create the backend in the database thread.
|
// Create the backend in the database thread.
|
||||||
// The backend gets parented to the database.
|
backend_ = new LibraryBackend();
|
||||||
backend_ = manager->database()->CreateInThread<LibraryBackend>();
|
backend_->moveToThread(manager->database());
|
||||||
|
|
||||||
backend_->Init(manager->database()->Worker(),
|
backend_->Init(manager->database()->Worker(),
|
||||||
QString("device_%1_songs").arg(database_id),
|
QString("device_%1_songs").arg(database_id),
|
||||||
QString("device_%1_directories").arg(database_id),
|
QString("device_%1_directories").arg(database_id),
|
||||||
|
@ -159,7 +159,8 @@ DeviceManager::DeviceManager(BackgroundThread<Database>* database,
|
|||||||
connect(task_manager_, SIGNAL(TasksChanged()), SLOT(TasksChanged()));
|
connect(task_manager_, SIGNAL(TasksChanged()), SLOT(TasksChanged()));
|
||||||
|
|
||||||
// Create the backend in the database thread
|
// Create the backend in the database thread
|
||||||
backend_ = database_->CreateInThread<DeviceDatabaseBackend>();
|
backend_ = new DeviceDatabaseBackend;
|
||||||
|
backend_->moveToThread(database);
|
||||||
backend_->Init(database_->Worker());
|
backend_->Init(database_->Worker());
|
||||||
|
|
||||||
DeviceDatabaseBackend::DeviceList devices = backend_->GetAllDevices();
|
DeviceDatabaseBackend::DeviceList devices = backend_->GetAllDevices();
|
||||||
|
@ -33,7 +33,9 @@ Library::Library(BackgroundThread<Database>* db_thread, TaskManager* task_manage
|
|||||||
watcher_factory_(new BackgroundThreadFactoryImplementation<LibraryWatcher, LibraryWatcher>),
|
watcher_factory_(new BackgroundThreadFactoryImplementation<LibraryWatcher, LibraryWatcher>),
|
||||||
watcher_(NULL)
|
watcher_(NULL)
|
||||||
{
|
{
|
||||||
backend_ = db_thread->CreateInThread<LibraryBackend>();
|
backend_ = new LibraryBackend;
|
||||||
|
backend()->moveToThread(db_thread);
|
||||||
|
|
||||||
backend_->Init(db_thread->Worker(), kSongsTable, kDirsTable, kSubdirsTable, kFtsTable);
|
backend_->Init(db_thread->Worker(), kSongsTable, kDirsTable, kSubdirsTable, kFtsTable);
|
||||||
|
|
||||||
model_ = new LibraryModel(backend_, this);
|
model_ = new LibraryModel(backend_, this);
|
||||||
|
@ -34,8 +34,8 @@ LibraryModel::LibraryModel(LibraryBackend* backend, QObject* parent)
|
|||||||
: SimpleTreeModel<LibraryItem>(new LibraryItem(this), parent),
|
: SimpleTreeModel<LibraryItem>(new LibraryItem(this), parent),
|
||||||
backend_(backend),
|
backend_(backend),
|
||||||
dir_model_(new LibraryDirectoryModel(backend, this)),
|
dir_model_(new LibraryDirectoryModel(backend, this)),
|
||||||
artist_icon_(IconLoader::Load("x-clementine-artist")),
|
artist_icon_(":/icons/22x22/x-clementine-artist"),
|
||||||
album_icon_(IconLoader::Load("x-clementine-album")),
|
album_icon_(":/icons/22x22/x-clementine-album"),
|
||||||
no_cover_icon_(":nocover.png")
|
no_cover_icon_(":nocover.png")
|
||||||
{
|
{
|
||||||
root_->lazy_loaded = true;
|
root_->lazy_loaded = true;
|
||||||
|
@ -153,7 +153,8 @@ MainWindow::MainWindow(NetworkAccessManager* network, Engine::Type engine, QWidg
|
|||||||
qDebug() << t.restart() << "database startup";
|
qDebug() << t.restart() << "database startup";
|
||||||
|
|
||||||
// Create some objects in the database thread
|
// Create some objects in the database thread
|
||||||
playlist_backend_ = database_->CreateInThread<PlaylistBackend>();
|
playlist_backend_ = new PlaylistBackend;
|
||||||
|
playlist_backend_->moveToThread(database_);
|
||||||
playlist_backend_->SetDatabase(database_->Worker());
|
playlist_backend_->SetDatabase(database_->Worker());
|
||||||
|
|
||||||
qDebug() << t.restart() << "playlist backend";
|
qDebug() << t.restart() << "playlist backend";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user