QtDBus: Move dispatch enabling code into a single function
Remove the helper class. Change-Id: I82edd7fa1ce1d8b9044938a1378f992a40a0bbdf Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
f99e518327
commit
8d13a9e387
@ -148,13 +148,9 @@ QDBusConnectionPrivate *QDBusConnectionManager::connectToBus(QDBusConnection::Bu
|
|||||||
data.suspendedDelivery = suspendedDelivery;
|
data.suspendedDelivery = suspendedDelivery;
|
||||||
|
|
||||||
emit connectionRequested(&data);
|
emit connectionRequested(&data);
|
||||||
if (suspendedDelivery && data.result->connection) {
|
if (suspendedDelivery && data.result->connection)
|
||||||
data.result->ref.ref();
|
data.result->enableDispatchDelayed(qApp); // qApp was checked in the caller
|
||||||
QDBusConnectionDispatchEnabler *o = new QDBusConnectionDispatchEnabler(data.result);
|
|
||||||
QMetaObject::invokeMethod(o, &QDBusConnectionDispatchEnabler::execute,
|
|
||||||
Qt::QueuedConnection);
|
|
||||||
o->moveToThread(qApp->thread()); // qApp was checked in the caller
|
|
||||||
}
|
|
||||||
return data.result;
|
return data.result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,6 +212,8 @@ public:
|
|||||||
|
|
||||||
void postEventToThread(int action, QObject *target, QEvent *event);
|
void postEventToThread(int action, QObject *target, QEvent *event);
|
||||||
|
|
||||||
|
void enableDispatchDelayed(QObject *context);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void checkThread();
|
void checkThread();
|
||||||
bool handleError(const QDBusErrorInternal &error);
|
bool handleError(const QDBusErrorInternal &error);
|
||||||
@ -357,27 +359,6 @@ extern QDBusMessage qDBusPropertySet(const QDBusConnectionPrivate::ObjectTreeNod
|
|||||||
extern QDBusMessage qDBusPropertyGetAll(const QDBusConnectionPrivate::ObjectTreeNode &node,
|
extern QDBusMessage qDBusPropertyGetAll(const QDBusConnectionPrivate::ObjectTreeNode &node,
|
||||||
const QDBusMessage &msg);
|
const QDBusMessage &msg);
|
||||||
|
|
||||||
// can be replaced with a lambda in Qt 5.7
|
|
||||||
class QDBusConnectionDispatchEnabler : public QObject
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
QDBusConnectionPrivate *con;
|
|
||||||
public:
|
|
||||||
QDBusConnectionDispatchEnabler(QDBusConnectionPrivate *con) : con(con) {}
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void execute()
|
|
||||||
{
|
|
||||||
// This call cannot race with something disabling dispatch only because dispatch is
|
|
||||||
// never re-disabled from Qt code on an in-use connection once it has been enabled.
|
|
||||||
QMetaObject::invokeMethod(
|
|
||||||
con, [con = con]() { con->setDispatchEnabled(true); }, Qt::QueuedConnection);
|
|
||||||
if (!con->ref.deref())
|
|
||||||
con->deleteLater();
|
|
||||||
deleteLater();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // QT_BOOTSTRAPPED
|
#endif // QT_BOOTSTRAPPED
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -293,12 +293,8 @@ static void qDBusNewConnection(DBusServer *server, DBusConnection *connection, v
|
|||||||
// QDBusServer's thread in order to enable it after the
|
// QDBusServer's thread in order to enable it after the
|
||||||
// QDBusServer::newConnection() signal has been received by the
|
// QDBusServer::newConnection() signal has been received by the
|
||||||
// application's code
|
// application's code
|
||||||
newConnection->ref.ref();
|
|
||||||
QReadLocker serverLock(&serverConnection->lock);
|
QReadLocker serverLock(&serverConnection->lock);
|
||||||
QDBusConnectionDispatchEnabler *o = new QDBusConnectionDispatchEnabler(newConnection);
|
newConnection->enableDispatchDelayed(serverConnection->serverObject);
|
||||||
QMetaObject::invokeMethod(o, &QDBusConnectionDispatchEnabler::execute, Qt::QueuedConnection);
|
|
||||||
if (serverConnection->serverObject)
|
|
||||||
o->moveToThread(serverConnection->serverObject->thread());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QDBusConnectionPrivate::_q_newConnection(QDBusConnectionPrivate *newConnection)
|
void QDBusConnectionPrivate::_q_newConnection(QDBusConnectionPrivate *newConnection)
|
||||||
@ -2656,6 +2652,28 @@ void QDBusConnectionPrivate::postEventToThread(int action, QObject *object, QEve
|
|||||||
QDBusLockerBase::reportThreadAction(action, QDBusLockerBase::AfterPost, this);
|
QDBusLockerBase::reportThreadAction(action, QDBusLockerBase::AfterPost, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Enable dispatch of D-Bus events for this connection, but only after
|
||||||
|
* context's thread's event loop has started and processed any already
|
||||||
|
* pending events. The event dispatch is then enabled in the DBus aux thread.
|
||||||
|
*/
|
||||||
|
void QDBusConnectionPrivate::enableDispatchDelayed(QObject *context)
|
||||||
|
{
|
||||||
|
ref.ref();
|
||||||
|
QMetaObject::invokeMethod(
|
||||||
|
context,
|
||||||
|
[this]() {
|
||||||
|
// This call cannot race with something disabling dispatch only
|
||||||
|
// because dispatch is never re-disabled from Qt code on an
|
||||||
|
// in-use connection once it has been enabled.
|
||||||
|
QMetaObject::invokeMethod(
|
||||||
|
this, [this] { setDispatchEnabled(true); }, Qt::QueuedConnection);
|
||||||
|
if (!ref.deref())
|
||||||
|
deleteLater();
|
||||||
|
},
|
||||||
|
Qt::QueuedConnection);
|
||||||
|
}
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
#endif // QT_NO_DBUS
|
#endif // QT_NO_DBUS
|
||||||
|
Loading…
x
Reference in New Issue
Block a user