From 7c9e61a3fe6da233571f24acf7ec9d9a8fc43210 Mon Sep 17 00:00:00 2001 From: Ievgenii Meshcheriakov Date: Tue, 15 Aug 2023 13:14:57 +0200 Subject: QDBusConnectionManager: Use invokeMethod() to create servers Use QMetaObject::invokeMethod() with a lambda instead of setting up a permanent signal/slot connections with BlockingQueuedConnection type. This makes the code flow easier to follow. Change-Id: Ib6566e7a4694ecbd69900b645d020b3331fb3462 Reviewed-by: Thiago Macieira --- src/dbus/qdbusconnectionmanager.cpp | 17 ++++++++++------- src/dbus/qdbusconnectionmanager_p.h | 6 ++++-- src/dbus/qdbusserver.cpp | 4 ++-- 3 files changed, 16 insertions(+), 11 deletions(-) (limited to 'src/dbus') diff --git a/src/dbus/qdbusconnectionmanager.cpp b/src/dbus/qdbusconnectionmanager.cpp index 96d8d32185..02b35420c5 100644 --- a/src/dbus/qdbusconnectionmanager.cpp +++ b/src/dbus/qdbusconnectionmanager.cpp @@ -74,8 +74,6 @@ QDBusConnectionManager::QDBusConnectionManager() connect(this, &QDBusConnectionManager::connectionRequested, this, &QDBusConnectionManager::executeConnectionRequest, Qt::BlockingQueuedConnection); - connect(this, &QDBusConnectionManager::serverRequested, - this, &QDBusConnectionManager::createServer, Qt::BlockingQueuedConnection); moveToThread(this); // ugly, don't do this in other projects #ifdef Q_OS_WIN @@ -223,12 +221,17 @@ void QDBusConnectionManager::executeConnectionRequest(QDBusConnectionManager::Co } } -void QDBusConnectionManager::createServer(const QString &address, void *server) +void QDBusConnectionManager::createServer(const QString &address, QDBusServer *server) { - QDBusErrorInternal error; - QDBusConnectionPrivate *d = new QDBusConnectionPrivate; - d->setServer(static_cast(server), - q_dbus_server_listen(address.toUtf8().constData(), error), error); + QMetaObject::invokeMethod( + this, + [&address, server] { + QDBusErrorInternal error; + QDBusConnectionPrivate *d = new QDBusConnectionPrivate; + d->setServer(server, q_dbus_server_listen(address.toUtf8().constData(), error), + error); + }, + Qt::BlockingQueuedConnection); } QT_END_NAMESPACE diff --git a/src/dbus/qdbusconnectionmanager_p.h b/src/dbus/qdbusconnectionmanager_p.h index f6a153945a..e1eecf15a4 100644 --- a/src/dbus/qdbusconnectionmanager_p.h +++ b/src/dbus/qdbusconnectionmanager_p.h @@ -25,6 +25,8 @@ QT_BEGIN_NAMESPACE +class QDBusServer; + class QDBusConnectionManager : public QDaemonThread { Q_OBJECT @@ -42,18 +44,18 @@ public: QDBusConnectionPrivate *connectToBus(const QString &address, const QString &name); QDBusConnectionPrivate *connectToPeer(const QString &address, const QString &name); + void createServer(const QString &address, QDBusServer *server); + mutable QMutex mutex; signals: void connectionRequested(ConnectionRequestData *); - void serverRequested(const QString &address, void *server); protected: void run() override; private: void executeConnectionRequest(ConnectionRequestData *data); - void createServer(const QString &address, void *server); QHash connectionHash; diff --git a/src/dbus/qdbusserver.cpp b/src/dbus/qdbusserver.cpp index 2efc61a671..e298b14bf1 100644 --- a/src/dbus/qdbusserver.cpp +++ b/src/dbus/qdbusserver.cpp @@ -38,7 +38,7 @@ QDBusServer::QDBusServer(const QString &address, QObject *parent) if (!instance) return; - emit instance->serverRequested(address, this); + instance->createServer(address, this); Q_ASSERT(d != nullptr); QObject::connect(d, SIGNAL(newServerConnection(QDBusConnectionPrivate*)), @@ -67,7 +67,7 @@ QDBusServer::QDBusServer(QObject *parent) if (!instance) return; - emit instance->serverRequested(address, this); + instance->createServer(address, this); Q_ASSERT(d != nullptr); QObject::connect(d, SIGNAL(newServerConnection(QDBusConnectionPrivate*)), -- cgit v1.2.3