Add dispatcher thread implementation.

This should fix the endless dispatcher loop which throttled CPU usage to 100%.

Signed-off-by: Mavridis Philippe <mavridisf@gmail.com>
feat/dispatcher-thread
Mavridis Philippe 4 months ago
parent 39160735ce
commit a74979eff7
No known key found for this signature in database
GPG Key ID: F8D2D7E2F989A494

@ -37,9 +37,9 @@ install( FILES
tde_add_library( dbus-1-tqt SHARED AUTOMOC
SOURCES ${dbus_tqt_MOCS}
tqdbusconnection.cpp tqdbuserror.cpp tqdbusintegrator.cpp
tqdbusmarshall.cpp tqdbusmessage.cpp tqdbusserver.cpp
tqdbusproxy.cpp tqdbusdata.cpp tqdbusdatalist.cpp
tqdbusobjectpath.cpp tqdbusunixfd.cpp
tqdbusdispatcher.cpp tqdbusmarshall.cpp tqdbusmessage.cpp
tqdbusserver.cpp tqdbusproxy.cpp tqdbusdata.cpp
tqdbusdatalist.cpp tqdbusobjectpath.cpp tqdbusunixfd.cpp
tqdbusdataconverter.cpp
VERSION 0.0.0
LINK ${TQT_LIBRARIES} ${DBUS_LIBRARIES}

@ -50,6 +50,7 @@
#include "tqdbusmessage.h"
class TQT_DBusMessage;
class TQT_DBusDispatcher;
class TQSocketNotifier;
class TQTimer;
class TQTimerEvent;
@ -117,7 +118,7 @@ public:
DBusConnection *connection;
DBusServer *server;
TQTimer* dispatcher;
TQT_DBusDispatcher* dispatcher;
static int messageMetaType;
static int registerMessageMetaType();

@ -0,0 +1,64 @@
/* qdbusdispatcher.cpp TQT_DBusDispatcher private implementation
*
* Copyright (C) 2024 Mavridis Philippe <mavridisf@gmail.com>
*
* Licensed under the Academic Free License version 2.1
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*/
#include <tqmutex.h>
#include "tqdbusconnection_p.h"
#include "tqdbusdispatcher_p.h"
#include "tqdbusdispatcher_p.moc"
TQT_DBusDispatcher::TQT_DBusDispatcher(TQT_DBusConnectionPrivate *connection)
: TQObject(), m_connection(connection), m_busy(new TQMutex()), m_dispatch(false)
{
}
TQT_DBusDispatcher::~TQT_DBusDispatcher()
{
}
void TQT_DBusDispatcher::run()
{
m_dispatch = true;
while (m_dispatch)
{
usleep(50);
dispatch();
}
}
void TQT_DBusDispatcher::dispatch()
{
TQMutexLocker locker(m_busy);
if (m_connection->mode == TQT_DBusConnectionPrivate::ClientMode)
{
if (dbus_connection_dispatch(m_connection->connection) != DBUS_DISPATCH_DATA_REMAINS)
{
if (running())
{
m_dispatch = false;
exit();
}
}
}
}

@ -0,0 +1,63 @@
/* qdbusdispatcher_p.h TQT_DBusDispatcher private object
*
* Copyright (C) 2024 Mavridis Philippe <mavridisf@gmail.com>
*
* Licensed under the Academic Free License version 2.1
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*/
//
// W A R N I N G
// -------------
//
// This file is not part of the public API. This header file may
// change from version to version without notice, or even be
// removed.
//
// We mean it.
//
//
#ifndef TQDBUSDISPATCHER_P_H
#define TQDBUSDISPATCHER_P_H
#include <tqthread.h>
class TQT_DBusConnectionPrivate;
class TQMutex;
class TQT_DBusDispatcher : public TQObject, public TQThread
{
TQ_OBJECT
public:
TQT_DBusDispatcher(TQT_DBusConnectionPrivate *connection);
~TQT_DBusDispatcher();
void run();
public slots:
void dispatch();
private:
TQT_DBusConnectionPrivate *m_connection;
TQMutex *m_busy;
bool m_dispatch;
};
#endif

@ -29,6 +29,7 @@
#include <tqtimer.h>
#include "tqdbusconnection_p.h"
#include "tqdbusdispatcher_p.h"
#include "tqdbusmessage.h"
Atomic::Atomic(int value) : m_value(value)
@ -273,16 +274,14 @@ int TQT_DBusConnectionPrivate::registerMessageMetaType()
TQT_DBusConnectionPrivate::TQT_DBusConnectionPrivate(TQObject *parent)
: TQObject(parent), ref(1), mode(InvalidMode), connection(0), server(0),
dispatcher(0), inDispatch(false)
dispatcher(new TQT_DBusDispatcher(this))
{
static const int msgType = registerMessageMetaType();
Q_UNUSED(msgType);
dbus_threads_init_default();
dbus_error_init(&error);
dispatcher = new TQTimer(this);
TQObject::connect(dispatcher, TQ_SIGNAL(timeout()), this, TQ_SLOT(dispatch()));
m_resultEmissionQueueTimer = new TQTimer(this);
TQObject::connect(m_resultEmissionQueueTimer, TQ_SIGNAL(timeout()), this, TQ_SLOT(transmitResultEmissionQueue()));
m_messageEmissionQueueTimer = new TQTimer(this);
@ -485,28 +484,12 @@ void TQT_DBusConnectionPrivate::purgeRemovedWatches()
void TQT_DBusConnectionPrivate::scheduleDispatch()
{
dispatcher->start(0);
dispatcher->start();
}
void TQT_DBusConnectionPrivate::dispatch()
{
// dbus_connection_dispatch will hang if called recursively
if (inDispatch) {
printf("[dbus-1-tqt] WARNING: Attempt to call dispatch() recursively was silently ignored to prevent lockup!\n\r"); fflush(stdout);
return;
}
inDispatch = true;
if (mode == ClientMode)
{
if (dbus_connection_dispatch(connection) != DBUS_DISPATCH_DATA_REMAINS)
{
// stop dispatch timer
dispatcher->stop();
}
}
inDispatch = false;
TQTimer::singleShot(0, dispatcher, TQ_SLOT(dispatch()));
}
void TQT_DBusConnectionPrivate::transmitMessageEmissionQueue()

Loading…
Cancel
Save