summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMavridis Philippe <mavridisf@gmail.com>2024-07-26 19:37:27 +0300
committerMavridis Philippe <mavridisf@gmail.com>2024-07-26 19:37:27 +0300
commita74979eff791cc86b90f5e418bae046b249e01e1 (patch)
tree61ad07c21cdea6ac7028bd108e6bde42f793de37
parent39160735cee72c3e5a3e8d672fd9f6cd39278c53 (diff)
downloaddbus-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.txt6
-rw-r--r--src/tqdbusconnection_p.h3
-rw-r--r--src/tqdbusdispatcher.cpp64
-rw-r--r--src/tqdbusdispatcher_p.h63
-rw-r--r--src/tqdbusintegrator.cpp27
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()