diff options
author | Mavridis Philippe <mavridisf@gmail.com> | 2024-07-26 19:37:27 +0300 |
---|---|---|
committer | Mavridis Philippe <mavridisf@gmail.com> | 2024-07-26 19:37:27 +0300 |
commit | a74979eff791cc86b90f5e418bae046b249e01e1 (patch) | |
tree | 61ad07c21cdea6ac7028bd108e6bde42f793de37 | |
parent | 39160735cee72c3e5a3e8d672fd9f6cd39278c53 (diff) | |
download | dbus-1-tqt-feat/dispatcher-thread.tar.gz dbus-1-tqt-feat/dispatcher-thread.zip |
Add dispatcher thread implementation.feat/dispatcher-thread
This should fix the endless dispatcher loop which throttled CPU usage to 100%.
Signed-off-by: Mavridis Philippe <mavridisf@gmail.com>
-rw-r--r-- | src/CMakeLists.txt | 6 | ||||
-rw-r--r-- | src/tqdbusconnection_p.h | 3 | ||||
-rw-r--r-- | src/tqdbusdispatcher.cpp | 64 | ||||
-rw-r--r-- | src/tqdbusdispatcher_p.h | 63 | ||||
-rw-r--r-- | src/tqdbusintegrator.cpp | 27 |
5 files changed, 137 insertions, 26 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c09379a..c2ca29d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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} diff --git a/src/tqdbusconnection_p.h b/src/tqdbusconnection_p.h index 48cd623..2c42184 100644 --- a/src/tqdbusconnection_p.h +++ b/src/tqdbusconnection_p.h @@ -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(); diff --git a/src/tqdbusdispatcher.cpp b/src/tqdbusdispatcher.cpp new file mode 100644 index 0000000..d04943a --- /dev/null +++ b/src/tqdbusdispatcher.cpp @@ -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(); + } + } + } +}
\ No newline at end of file diff --git a/src/tqdbusdispatcher_p.h b/src/tqdbusdispatcher_p.h new file mode 100644 index 0000000..a0949a6 --- /dev/null +++ b/src/tqdbusdispatcher_p.h @@ -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
\ No newline at end of file diff --git a/src/tqdbusintegrator.cpp b/src/tqdbusintegrator.cpp index 2d3322a..8e2470e 100644 --- a/src/tqdbusintegrator.cpp +++ b/src/tqdbusintegrator.cpp @@ -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() |