Re: [RFC PATCH 0/2] Allow GUI plugins to build standalone

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 11.02.22 г. 7:03 ч., Chen, Hongzhan wrote:
But when I double click the box , kernel-shark quit abnormally with segmentation fault.

Following is backtrace info:

[Thread 0x7fffc084d700 (LWP 2064) exited]

Thread 1 "kernelshark" received signal SIGSEGV, Segmentation fault.
KsMainWindow::markEntry (this=0x0, e=0x7fffadf90f60, st=DualMarkerState::B) at /home/intel/iotg/dovetail/kernelshark/kernel-shark/src/KsUtils.hpp:229
229             ssize_t size() const {return _dataSize;}
(gdb) backtrace
#0  0x00007ffff7b91442 in KsMainWindow::markEntry(kshark_entry const*, DualMarkerState) (this=0x0, e=0x7fffadf90f60, st=DualMarkerState::B)
     at /home/intel/iotg/dovetail/kernelshark/kernel-shark/src/KsUtils.hpp:229
#1  0x00007fffc0876329 in XenomaiSwitchBox::_doubleClick() const (this=0x1c7ebc0) at CobaltSwitchEvents.cpp:43
#2  0x00007ffff5a2594f in QWidget::event(QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#3  0x00007ffff59e683c in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#4  0x00007ffff59ee65f in QApplication::notify(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#5  0x00007ffff48dc8a8 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#6  0x00007ffff59ed632 in QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer<QWidget>&, bool) ()
     at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#7  0x00007ffff5a4015b in  () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#8  0x00007ffff5a427ca in  () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#9  0x00007ffff59e683c in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#10 0x00007ffff59ee104 in QApplication::notify(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#11 0x00007ffff48dc8a8 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#12 0x00007ffff522a780 in QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::MouseEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#13 0x00007ffff522c0b5 in QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#14 0x00007ffff520333b in QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#15 0x00007fffed8ae260 in  () at /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5
#16 0x00007ffff13b7537 in g_main_context_dispatch () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#17 0x00007ffff13b7770 in  () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#18 0x00007ffff13b77fc in g_main_context_iteration () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#19 0x00007ffff493585f in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#20 0x00007ffff48da8da in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#21 0x00007ffff48e3984 in QCoreApplication::exec() () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#22 0x0000000000402af5 in main (argc=<optimized out>, argv=<optimized out>) at /home/intel/iotg/dovetail/kernelshark/kernel-shark/src/kernelshark.cpp:154
#23 0x00007ffff369abf7 in __libc_start_main (main=
     0x402480 <main>, argc=1, argv=0x7fffffffdd18, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffdd08) at ../csu/libc-start.c:310
#24 0x0000000000402cfa in _start () at /home/intel/iotg/dovetail/kernelshark/kernel-shark/src/kernelshark.cpp:129
(gdb)


Hi Hongzhan,

I have an idea what can be the problem here.
Please try applying the attached patch and let me know if the double click works.

Thanks!
Yordan


Regards

Hongzhan Chen
From 9caaf7041d5f8821ee79007f36f9c465364ee548 Mon Sep 17 00:00:00 2001
From: "Yordan Karadzhov (VMware)" <y.karadz@xxxxxxxxx>
Date: Fri, 11 Feb 2022 14:09:56 +0200
Subject: [PATCH] kernel-shark: Load ctrl interface for user plugins (WiP)

Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@xxxxxxxxx>
---
 src/KsUtils.cpp | 37 +++++++++++++++++++++++--------------
 src/KsUtils.hpp |  4 +++-
 2 files changed, 26 insertions(+), 15 deletions(-)

diff --git a/src/KsUtils.cpp b/src/KsUtils.cpp
index a22c445..f62987b 100644
--- a/src/KsUtils.cpp
+++ b/src/KsUtils.cpp
@@ -1057,11 +1057,11 @@ void KsDataStore::setClockOffset(int sd, int64_t offset)
 KsPluginManager::KsPluginManager(QWidget *parent)
 : QObject(parent)
 {
-	_loadPluginList(KsUtils::getPluginList());
+	_loadPluginList(KsUtils::getPluginList(), false);
 }
 
 QVector<kshark_plugin_list *>
-KsPluginManager::_loadPluginList(const QStringList &plugins)
+KsPluginManager::_loadPluginList(const QStringList &plugins, bool regCtrl)
 {
 	kshark_context *kshark_ctx(nullptr);
 	QVector<kshark_plugin_list *> vec;
@@ -1090,8 +1090,11 @@ KsPluginManager::_loadPluginList(const QStringList &plugins)
 							name.c_str(),
 							lib.c_str());
 
-			if (plugin)
+			if (plugin) {
 				vec.append(plugin);
+				if (regCtrl)
+					_registerCtrlInterface(plugin);
+			}
 		}
 	}
 
@@ -1190,6 +1193,19 @@ QVector<int> KsPluginManager::getPluginsByStatus(int sd, int status) const
 	return vec;
 }
 
+void KsPluginManager::_registerCtrlInterface(kshark_plugin_list *plugin)
+{
+	if (!plugin->handle || !plugin->ctrl_interface)
+		return;
+
+	void *dialogPtr = plugin->ctrl_interface(parent());
+	if (dialogPtr) {
+		QWidget *dialog = static_cast<QWidget *>(dialogPtr);
+		if (_pluginDialogs.indexOf(dialog) < 0)
+			_pluginDialogs.append(dialog);
+	}
+}
+
 /**
  * @brief Loop over the registered plugins and register all plugin-defined
  *	  menus (if any).
@@ -1203,14 +1219,7 @@ void KsPluginManager::registerPluginMenues()
 		return;
 
 	for (plugin = kshark_ctx->plugins; plugin; plugin = plugin->next)
-		if (plugin->handle && plugin->ctrl_interface) {
-			void *dialogPtr = plugin->ctrl_interface(parent());
-			if (dialogPtr) {
-				QWidget *dialog =
-					static_cast<QWidget *>(dialogPtr);
-				_pluginDialogs.append(dialog);
-			}
-		}
+		_registerCtrlInterface(plugin);
 }
 
 std::string KsPluginManager::_pluginLibFromName(const QString &plugin)
@@ -1247,11 +1256,11 @@ std::string KsPluginManager::_pluginNameFromLib(const QString &plugin)
  * @param pluginNames: Provide here the names of the plugin (as in the
  *		       CMake-generated header file) or the names of the
  *		       plugin's library files (.so including path).
- * 		       The names must be comma separated.
+ *		       The names must be comma separated.
  */
 void KsPluginManager::registerPlugins(const QString &pluginNames)
 {
-	_userPlugins.append(_loadPluginList(pluginNames.split(',')));
+	_userPlugins.append(_loadPluginList(pluginNames.split(','), true));
 }
 
 /**
@@ -1368,7 +1377,7 @@ void KsPluginManager::addPlugins(const QStringList &fileNames,
 	if (!kshark_instance(&kshark_ctx))
 		return;
 
-	plugins = _loadPluginList(fileNames);
+	plugins = _loadPluginList(fileNames, true);
 	_userPlugins.append(plugins);
 
 	if (streamIds.isEmpty())
diff --git a/src/KsUtils.hpp b/src/KsUtils.hpp
index 1a97d9e..ec58c44 100644
--- a/src/KsUtils.hpp
+++ b/src/KsUtils.hpp
@@ -328,7 +328,9 @@ private:
 	QVector<QWidget *>		_pluginDialogs;
 
 	QVector<kshark_plugin_list *>
-	_loadPluginList(const QStringList &plugins);
+	_loadPluginList(const QStringList &plugins, bool regCtrl);
+
+	void _registerCtrlInterface(kshark_plugin_list *plugin);
 
 	std::string _pluginLibFromName(const QString &plugin);
 
-- 
2.32.0


[Index of Archives]     [Linux USB Development]     [Linux USB Development]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux