* [PATCH v2 1/8] kernel-shark: Add INSTALL PREFIX to the Cmake-generated header file.
2019-05-02 12:40 [PATCH v2 0/8] Modifications needed for KS 1.0 Yordan Karadzhov
@ 2019-05-02 12:40 ` Yordan Karadzhov
2019-05-02 12:40 ` [PATCH v2 2/8] kernel-shark: Add logic for the initial path of Open-File dialogs Yordan Karadzhov
` (6 subsequent siblings)
7 siblings, 0 replies; 13+ messages in thread
From: Yordan Karadzhov @ 2019-05-02 12:40 UTC (permalink / raw)
To: rostedt
Cc: linux-trace-devel, y.karadz, troyengel, Yordan Karadzhov,
Slavomir Kaslev
To be used to check if the aplication runs from its installation location.
Reviewed-by: Slavomir Kaslev <kaslevs@vmware.com>
Signed-off-by: Yordan Karadzhov <ykaradzhov@vmware.com>
---
kernel-shark/build/deff.h.cmake | 3 +++
1 file changed, 3 insertions(+)
diff --git a/kernel-shark/build/deff.h.cmake b/kernel-shark/build/deff.h.cmake
index 8041cfc..ba211f4 100644
--- a/kernel-shark/build/deff.h.cmake
+++ b/kernel-shark/build/deff.h.cmake
@@ -14,6 +14,9 @@
/** KernelShark source code path. */
#cmakedefine KS_DIR "@KS_DIR@"
+/** KernelShark installation prefix path. */
+#cmakedefine _INSTALL_PREFIX "@_INSTALL_PREFIX@"
+
/** Location of the trace-cmd executable. */
#cmakedefine TRACECMD_BIN_DIR "@TRACECMD_BIN_DIR@"
--
2.20.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 2/8] kernel-shark: Add logic for the initial path of Open-File dialogs
2019-05-02 12:40 [PATCH v2 0/8] Modifications needed for KS 1.0 Yordan Karadzhov
2019-05-02 12:40 ` [PATCH v2 1/8] kernel-shark: Add INSTALL PREFIX to the Cmake-generated header file Yordan Karadzhov
@ 2019-05-02 12:40 ` Yordan Karadzhov
2019-05-02 12:40 ` [PATCH v2 3/8] kernel-shark: Add logic for the plugins search path Yordan Karadzhov
` (5 subsequent siblings)
7 siblings, 0 replies; 13+ messages in thread
From: Yordan Karadzhov @ 2019-05-02 12:40 UTC (permalink / raw)
To: rostedt
Cc: linux-trace-devel, y.karadz, troyengel, Yordan Karadzhov,
Slavomir Kaslev
If the application has been started from its installation location,
all Open File dialogs will start at ${HOME}. Otherwise the dialogs will
start at ${PWD}. If a given dialog has been used already to select a file,
next time the dialog will start in the directory of this file.
Suggested-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Reviewed-by: Slavomir Kaslev <kaslevs@vmware.com>
Signed-off-by: Yordan Karadzhov <ykaradzhov@vmware.com>
---
kernel-shark/src/KsCaptureDialog.cpp | 34 +++-----
kernel-shark/src/KsCaptureDialog.hpp | 2 +
kernel-shark/src/KsMainWindow.cpp | 70 ++++++----------
kernel-shark/src/KsMainWindow.hpp | 4 +-
kernel-shark/src/KsUtils.cpp | 121 +++++++++++++++++++++++++++
kernel-shark/src/KsUtils.hpp | 17 ++++
6 files changed, 183 insertions(+), 65 deletions(-)
diff --git a/kernel-shark/src/KsCaptureDialog.cpp b/kernel-shark/src/KsCaptureDialog.cpp
index 1272c2e..2976a3b 100644
--- a/kernel-shark/src/KsCaptureDialog.cpp
+++ b/kernel-shark/src/KsCaptureDialog.cpp
@@ -206,10 +206,9 @@ void KsCaptureControl::_importSettings()
events = tep_list_events(_localTEP, TEP_EVENT_SORT_SYSTEM);
/* Get the configuration document. */
- fileName = QFileDialog::getOpenFileName(this,
- "Import from Filter",
- KS_DIR,
- "Kernel Shark Config files (*.json);;");
+ fileName = KsUtils::getFile(this, "Import from Filter",
+ "Kernel Shark Config files (*.json);;",
+ _lastFilePath);
if (fileName.isEmpty())
return;
@@ -256,23 +255,16 @@ void KsCaptureControl::_exportSettings()
json_object *jplugin;
QString plugin, out, comm;
QVector<int> ids;
- QString fileName =
- QFileDialog::getSaveFileName(this,
- "Export to File",
- KS_DIR,
- "Kernel Shark Config files (*.json);;");
+ QString fileName;
+
+ fileName = KsUtils::getSaveFile(this, "Export to File",
+ "Kernel Shark Config files (*.json);;",
+ ".json",
+ _lastFilePath);
if (fileName.isEmpty())
return;
- if (!fileName.endsWith(".json")) {
- fileName += ".json";
- if (QFileInfo(fileName).exists()) {
- if (!KsWidgetsLib::fileExistsDialog(fileName))
- return;
- }
- }
-
/* Create a configuration document. */
conf = kshark_record_config_new(KS_CONFIG_JSON);
events = kshark_filter_config_new(KS_CONFIG_JSON);
@@ -312,10 +304,10 @@ void KsCaptureControl::_exportSettings()
void KsCaptureControl::_browse()
{
QString fileName =
- QFileDialog::getSaveFileName(this,
- "Save File",
- KS_DIR,
- "trace-cmd files (*.dat);;All files (*)");
+ KsUtils::getSaveFile(this, "Save File",
+ "trace-cmd files (*.dat);;All files (*)",
+ ".dat",
+ _lastFilePath);
if (!fileName.isEmpty())
_outputLineEdit.setText(fileName);
diff --git a/kernel-shark/src/KsCaptureDialog.hpp b/kernel-shark/src/KsCaptureDialog.hpp
index d65f475..2265704 100644
--- a/kernel-shark/src/KsCaptureDialog.hpp
+++ b/kernel-shark/src/KsCaptureDialog.hpp
@@ -61,6 +61,8 @@ private:
QPushButton _outputBrowseButton;
+ QString _lastFilePath;
+
QStringList _getPlugins();
void _importSettings();
diff --git a/kernel-shark/src/KsMainWindow.cpp b/kernel-shark/src/KsMainWindow.cpp
index c839aca..748bacd 100644
--- a/kernel-shark/src/KsMainWindow.cpp
+++ b/kernel-shark/src/KsMainWindow.cpp
@@ -360,11 +360,11 @@ void KsMainWindow::_createMenus()
void KsMainWindow::_open()
{
- QString fileName =
- QFileDialog::getOpenFileName(this,
- "Open File",
- KS_DIR,
- "trace-cmd files (*.dat);;All files (*)");
+ QString fileName;
+
+ fileName = KsUtils::getFile(this, "Open File",
+ "trace-cmd files (*.dat);;All files (*)",
+ _lastDataFilePath);
if (!fileName.isEmpty())
loadDataFile(fileName);
@@ -429,11 +429,11 @@ void KsMainWindow::_restoreSession()
void KsMainWindow::_importSession()
{
- QString fileName =
- QFileDialog::getOpenFileName(this,
- "Import Session",
- KS_DIR,
- "Kernel Shark Config files (*.json);;");
+ QString fileName;
+
+ fileName = KsUtils::getFile(this, "Import Session",
+ "Kernel Shark Config files (*.json);;",
+ _lastConfFilePath);
if (fileName.isEmpty())
return;
@@ -460,23 +460,15 @@ void KsMainWindow::_updateSession()
void KsMainWindow::_exportSession()
{
- QString fileName =
- QFileDialog::getSaveFileName(this,
- "Export Filter",
- KS_DIR,
- "Kernel Shark Config files (*.json);;");
+ QString fileName;
+ fileName = KsUtils::getSaveFile(this, "Export Filter",
+ "Kernel Shark Config files (*.json);;",
+ ".json",
+ _lastConfFilePath);
if (fileName.isEmpty())
return;
- if (!fileName.endsWith(".json")) {
- fileName += ".json";
- if (QFileInfo(fileName).exists()) {
- if (!KsWidgetsLib::fileExistsDialog(fileName))
- return;
- }
- }
-
_updateSession();
_session.exportToFile(fileName);
}
@@ -512,8 +504,9 @@ void KsMainWindow::_importFilter()
if (!kshark_instance(&kshark_ctx))
return;
- fileName = QFileDialog::getOpenFileName(this, "Import Filter", KS_DIR,
- "Kernel Shark Config files (*.json);;");
+ fileName = KsUtils::getFile(this, "Import Filter",
+ "Kernel Shark Config files (*.json);;",
+ _lastConfFilePath);
if (fileName.isEmpty())
return;
@@ -540,20 +533,14 @@ void KsMainWindow::_exportFilter()
if (!kshark_instance(&kshark_ctx))
return;
- fileName = QFileDialog::getSaveFileName(this, "Export Filter", KS_DIR,
- "Kernel Shark Config files (*.json);;");
+ fileName = KsUtils::getSaveFile(this, "Export Filter",
+ "Kernel Shark Config files (*.json);;",
+ ".json",
+ _lastConfFilePath);
if (fileName.isEmpty())
return;
- if (!fileName.endsWith(".json")) {
- fileName += ".json";
- if (QFileInfo(fileName).exists()) {
- if (!KsWidgetsLib::fileExistsDialog(fileName))
- return;
- }
- }
-
kshark_export_all_event_filters(kshark_ctx, &conf);
kshark_save_config_file(fileName.toStdString().c_str(), conf);
kshark_free_config_doc(conf);
@@ -859,15 +846,12 @@ void KsMainWindow::_pluginAdd()
{
QStringList fileNames;
- fileNames =
- QFileDialog::getOpenFileNames(this, "Add KernelShark plugins",
- KS_DIR,
- "KernelShark Plugins (*.so);;");
-
- if (fileNames.isEmpty())
- return;
+ fileNames = KsUtils::getFiles(this, "Add KernelShark plugins",
+ "KernelShark Plugins (*.so);;",
+ _lastPluginFilePath);
- _plugins.addPlugins(fileNames);
+ if (!fileNames.isEmpty())
+ _plugins.addPlugins(fileNames);
}
void KsMainWindow::_record()
diff --git a/kernel-shark/src/KsMainWindow.hpp b/kernel-shark/src/KsMainWindow.hpp
index ec6506e..2bf3285 100644
--- a/kernel-shark/src/KsMainWindow.hpp
+++ b/kernel-shark/src/KsMainWindow.hpp
@@ -151,7 +151,9 @@ private:
QAction _contentsAction;
- QShortcut _deselectShortcut;
+ QShortcut _deselectShortcut;
+
+ QString _lastDataFilePath, _lastConfFilePath, _lastPluginFilePath;
void _open();
diff --git a/kernel-shark/src/KsUtils.cpp b/kernel-shark/src/KsUtils.cpp
index 6af0c66..8c42206 100644
--- a/kernel-shark/src/KsUtils.cpp
+++ b/kernel-shark/src/KsUtils.cpp
@@ -11,6 +11,7 @@
// KernelShark
#include "KsUtils.hpp"
+#include "KsWidgetsLib.hpp"
namespace KsUtils {
@@ -136,6 +137,126 @@ bool matchCPUVisible(struct kshark_context *kshark_ctx,
return (e->cpu == cpu && (e->visible & KS_GRAPH_VIEW_FILTER_MASK));
}
+/**
+ * @brief Check if the application runs from its installation location.
+ */
+bool isInstalled()
+{
+ QString appPath = QCoreApplication::applicationFilePath();
+ QString installPath(_INSTALL_PREFIX);
+
+ installPath += "/bin/kernelshark";
+ installPath = QDir::cleanPath(installPath);
+
+ return appPath == installPath;
+}
+
+static QString getFileDialog(QWidget *parent,
+ const QString &windowName,
+ const QString &filter,
+ QString &lastFilePath,
+ bool forSave)
+{
+ QString fileName;
+
+ if (lastFilePath.isEmpty()) {
+ lastFilePath = isInstalled() ? QDir::homePath() :
+ QDir::currentPath();
+ }
+
+ if (forSave) {
+ fileName = QFileDialog::getSaveFileName(parent,
+ windowName,
+ lastFilePath,
+ filter);
+ } else {
+ fileName = QFileDialog::getOpenFileName(parent,
+ windowName,
+ lastFilePath,
+ filter);
+ }
+
+ if (!fileName.isEmpty())
+ lastFilePath = QFileInfo(fileName).path();
+
+ return fileName;
+}
+
+static QStringList getFilesDialog(QWidget *parent,
+ const QString &windowName,
+ const QString &filter,
+ QString &lastFilePath)
+{
+ QStringList fileNames;
+
+ if (lastFilePath.isEmpty()) {
+ lastFilePath = isInstalled() ? QDir::homePath() :
+ QDir::currentPath();
+ }
+
+ fileNames = QFileDialog::getOpenFileNames(parent,
+ windowName,
+ lastFilePath,
+ filter);
+
+ if (!fileNames.isEmpty())
+ lastFilePath = QFileInfo(fileNames[0]).path();
+
+ return fileNames;
+}
+
+/**
+ * @brief Open a standard Qt getFileName dialog and return the name of the
+ * selected file. Only one file can be selected.
+ */
+QString getFile(QWidget *parent,
+ const QString &windowName,
+ const QString &filter,
+ QString &lastFilePath)
+{
+ return getFileDialog(parent, windowName, filter, lastFilePath, false);
+}
+
+/**
+ * @brief Open a standard Qt getFileName dialog and return the names of the
+ * selected files. Multiple files can be selected.
+ */
+QStringList getFiles(QWidget *parent,
+ const QString &windowName,
+ const QString &filter,
+ QString &lastFilePath)
+{
+ return getFilesDialog(parent, windowName, filter, lastFilePath);
+}
+
+/**
+ * @brief Open a standard Qt getFileName dialog and return the name of the
+ * selected file. Only one file can be selected.
+ */
+QString getSaveFile(QWidget *parent,
+ const QString &windowName,
+ const QString &filter,
+ const QString &extension,
+ QString &lastFilePath)
+{
+ QString fileName = getFileDialog(parent,
+ windowName,
+ filter,
+ lastFilePath,
+ true);
+
+ if (!fileName.isEmpty() && !fileName.endsWith(extension)) {
+ fileName += extension;
+
+ if (QFileInfo(fileName).exists()) {
+ if (!KsWidgetsLib::fileExistsDialog(fileName))
+ fileName.clear();
+ }
+ }
+
+ return fileName;
+}
+
}; // KsUtils
/** A stream operator for converting QColor into KsPlot::Color. */
diff --git a/kernel-shark/src/KsUtils.hpp b/kernel-shark/src/KsUtils.hpp
index c8b5e88..7b80b21 100644
--- a/kernel-shark/src/KsUtils.hpp
+++ b/kernel-shark/src/KsUtils.hpp
@@ -111,6 +111,23 @@ inline QString Ts2String(int64_t ts, int prec)
bool matchCPUVisible(struct kshark_context *kshark_ctx,
struct kshark_entry *e, int cpu);
+
+QString getFile(QWidget *parent,
+ const QString &windowName,
+ const QString &filter,
+ QString &lastFilePath);
+
+QStringList getFiles(QWidget *parent,
+ const QString &windowName,
+ const QString &filter,
+ QString &lastFilePath);
+
+QString getSaveFile(QWidget *parent,
+ const QString &windowName,
+ const QString &filter,
+ const QString &extension,
+ QString &lastFilePath);
+
}; // KsUtils
/** Identifier of the Dual Marker active state. */
--
2.20.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 3/8] kernel-shark: Add logic for the plugins search path
2019-05-02 12:40 [PATCH v2 0/8] Modifications needed for KS 1.0 Yordan Karadzhov
2019-05-02 12:40 ` [PATCH v2 1/8] kernel-shark: Add INSTALL PREFIX to the Cmake-generated header file Yordan Karadzhov
2019-05-02 12:40 ` [PATCH v2 2/8] kernel-shark: Add logic for the initial path of Open-File dialogs Yordan Karadzhov
@ 2019-05-02 12:40 ` Yordan Karadzhov
2019-05-03 23:05 ` Steven Rostedt
2019-05-02 12:40 ` [PATCH v2 4/8] kernel-shark: Remove the definition of KS_DIR Yordan Karadzhov
` (4 subsequent siblings)
7 siblings, 1 reply; 13+ messages in thread
From: Yordan Karadzhov @ 2019-05-02 12:40 UTC (permalink / raw)
To: rostedt
Cc: linux-trace-devel, y.karadz, troyengel, Yordan Karadzhov,
Slavomir Kaslev
If the application has not been started from its installation location
and the the directory
app_file_path + "../../kernel-shark/lib"
exists, all build-in plugins will be loaded from this directory. In any
other case all build-in plugins will be loaded from
_INSTALL_PREFIX/lib/kshark/plugins/
Suggested-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Reviewed-by: Slavomir Kaslev <kaslevs@vmware.com>
Signed-off-by: Yordan Karadzhov <ykaradzhov@vmware.com>
---
kernel-shark/src/KsUtils.cpp | 40 ++++++++++++++++++-------
kernel-shark/src/KsUtils.hpp | 2 ++
kernel-shark/src/plugins/CMakeLists.txt | 2 +-
3 files changed, 32 insertions(+), 12 deletions(-)
diff --git a/kernel-shark/src/KsUtils.cpp b/kernel-shark/src/KsUtils.cpp
index 8c42206..f62e53a 100644
--- a/kernel-shark/src/KsUtils.cpp
+++ b/kernel-shark/src/KsUtils.cpp
@@ -544,13 +544,12 @@ void KsPluginManager::_parsePluginList()
*/
void KsPluginManager::registerFromList(kshark_context *kshark_ctx)
{
- auto lamRegBuiltIn = [&kshark_ctx](const QString &plugin)
+ auto lamRegBuiltIn = [&kshark_ctx, this](const QString &plugin)
{
char *lib;
int n;
- n = asprintf(&lib, "%s/lib/plugin-%s.so",
- KS_DIR, plugin.toStdString().c_str());
+ lib = _pluginLibFromName(plugin, n);
if (n <= 0)
return;
@@ -579,13 +578,12 @@ void KsPluginManager::registerFromList(kshark_context *kshark_ctx)
*/
void KsPluginManager::unregisterFromList(kshark_context *kshark_ctx)
{
- auto lamUregBuiltIn = [&kshark_ctx](const QString &plugin)
+ auto lamUregBuiltIn = [&kshark_ctx, this](const QString &plugin)
{
char *lib;
int n;
- n = asprintf(&lib, "%s/lib/plugin-%s.so",
- KS_DIR, plugin.toStdString().c_str());
+ lib = _pluginLibFromName(plugin, n);
if (n <= 0)
return;
@@ -608,6 +606,28 @@ void KsPluginManager::unregisterFromList(kshark_context *kshark_ctx)
lamUregUser);
}
+char *KsPluginManager::_pluginLibFromName(const QString &plugin, int &n)
+{
+ QString execPath = QCoreApplication::applicationFilePath();
+ QString path = QFileInfo(execPath).path();
+ std::string pluginStr = plugin.toStdString();
+ char *lib;
+ QDir dir;
+
+ dir.setCurrent(path);
+ if (!KsUtils::isInstalled() && dir.cd("../../kernel-shark/lib")) {
+ std::string pathStr = dir.path().toStdString();
+
+ n = asprintf(&lib, "%s/plugin-%s.so",
+ pathStr.c_str(), pluginStr.c_str());
+ } else {
+ n = asprintf(&lib, "%s/lib/kshark/plugins/plugin-%s.so",
+ _INSTALL_PREFIX, pluginStr.c_str());
+ }
+
+ return lib;
+}
+
/**
* @brief Register a Plugin.
*
@@ -629,8 +649,7 @@ void KsPluginManager::registerPlugin(const QString &plugin)
* The argument is the name of the plugin. From the
* name get the library .so file.
*/
- n = asprintf(&lib, "%s/lib/plugin-%s.so",
- KS_DIR, plugin.toStdString().c_str());
+ lib = _pluginLibFromName(plugin, n);
if (n > 0) {
kshark_register_plugin(kshark_ctx, lib);
_registeredKsPlugins[i] = true;
@@ -691,8 +710,7 @@ void KsPluginManager::unregisterPlugin(const QString &plugin)
* The argument is the name of the plugin. From the
* name get the library .so file.
*/
- n = asprintf(&lib, "%s/lib/plugin-%s.so", KS_DIR,
- plugin.toStdString().c_str());
+ lib = _pluginLibFromName(plugin, n);
if (n > 0) {
kshark_unregister_plugin(kshark_ctx, lib);
_registeredKsPlugins[i] = false;
@@ -700,7 +718,7 @@ void KsPluginManager::unregisterPlugin(const QString &plugin)
}
return;
- } else if (plugin.contains("/lib/plugin-" +
+ } else if (plugin.contains("/lib/plugin-" +
_ksPluginList[i], Qt::CaseInsensitive)) {
/*
* The argument is the name of the library .so file.
diff --git a/kernel-shark/src/KsUtils.hpp b/kernel-shark/src/KsUtils.hpp
index 7b80b21..1c87271 100644
--- a/kernel-shark/src/KsUtils.hpp
+++ b/kernel-shark/src/KsUtils.hpp
@@ -241,6 +241,8 @@ signals:
private:
void _parsePluginList();
+ char *_pluginLibFromName(const QString &plugin, int &n);
+
template <class T>
void _forEachInList(const QStringList &pl,
const QVector<bool> ®,
diff --git a/kernel-shark/src/plugins/CMakeLists.txt b/kernel-shark/src/plugins/CMakeLists.txt
index 6098275..64cf98d 100644
--- a/kernel-shark/src/plugins/CMakeLists.txt
+++ b/kernel-shark/src/plugins/CMakeLists.txt
@@ -29,6 +29,6 @@ BUILD_PLUGIN(NAME missed_events
list(APPEND PLUGIN_LIST "missed_events default") # This plugin will be loaded by default
install(TARGETS sched_events missed_events
- LIBRARY DESTINATION ${_INSTALL_PREFIX}/lib/kshark/)
+ LIBRARY DESTINATION ${_INSTALL_PREFIX}/lib/kshark/plugins/)
set(PLUGINS ${PLUGIN_LIST} PARENT_SCOPE)
--
2.20.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v2 3/8] kernel-shark: Add logic for the plugins search path
2019-05-02 12:40 ` [PATCH v2 3/8] kernel-shark: Add logic for the plugins search path Yordan Karadzhov
@ 2019-05-03 23:05 ` Steven Rostedt
2019-05-04 8:27 ` Yordan Karadzhov (VMware)
2019-05-04 8:28 ` Yordan Karadzhov (VMware)
0 siblings, 2 replies; 13+ messages in thread
From: Steven Rostedt @ 2019-05-03 23:05 UTC (permalink / raw)
To: Yordan Karadzhov; +Cc: linux-trace-devel, y.karadz, troyengel, Slavomir Kaslev
On Thu, 2 May 2019 15:40:04 +0300
Yordan Karadzhov <ykaradzhov@vmware.com> wrote:
> If the application has not been started from its installation location
> and the the directory
>
> app_file_path + "../../kernel-shark/lib"
>
> exists, all build-in plugins will be loaded from this directory. In any
> other case all build-in plugins will be loaded from
>
> _INSTALL_PREFIX/lib/kshark/plugins/
>
> Suggested-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
> Reviewed-by: Slavomir Kaslev <kaslevs@vmware.com>
> Signed-off-by: Yordan Karadzhov <ykaradzhov@vmware.com>
> ---
> kernel-shark/src/KsUtils.cpp | 40 ++++++++++++++++++-------
> kernel-shark/src/KsUtils.hpp | 2 ++
> kernel-shark/src/plugins/CMakeLists.txt | 2 +-
> 3 files changed, 32 insertions(+), 12 deletions(-)
>
Hi Yordan,
After applying this patch, kernelshark's behavior for loading trace.dat
changed. It no longer looks for the file in the current directory. If I
run:
# trace-cmd record -e sched_switch sleep 1
# kernelshark
It loads without loading the produced trace.dat.
If I run:
# kernelshark trace.dat
I get an error message stating:
"Unable to find file trace.dat"
-- Steve
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 3/8] kernel-shark: Add logic for the plugins search path
2019-05-03 23:05 ` Steven Rostedt
@ 2019-05-04 8:27 ` Yordan Karadzhov (VMware)
2019-05-04 11:31 ` Steven Rostedt
2019-05-04 8:28 ` Yordan Karadzhov (VMware)
1 sibling, 1 reply; 13+ messages in thread
From: Yordan Karadzhov (VMware) @ 2019-05-04 8:27 UTC (permalink / raw)
To: Steven Rostedt, Yordan Karadzhov
Cc: linux-trace-devel, troyengel, Slavomir Kaslev
On 4.05.19 г. 2:05 ч., Steven Rostedt wrote:
> On Thu, 2 May 2019 15:40:04 +0300
> Yordan Karadzhov <ykaradzhov@vmware.com> wrote:
>
>> If the application has not been started from its installation location
>> and the the directory
>>
>> app_file_path + "../../kernel-shark/lib"
>>
>> exists, all build-in plugins will be loaded from this directory. In any
>> other case all build-in plugins will be loaded from
>>
>> _INSTALL_PREFIX/lib/kshark/plugins/
>>
>> Suggested-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
>> Reviewed-by: Slavomir Kaslev <kaslevs@vmware.com>
>> Signed-off-by: Yordan Karadzhov <ykaradzhov@vmware.com>
>> ---
>> kernel-shark/src/KsUtils.cpp | 40 ++++++++++++++++++-------
>> kernel-shark/src/KsUtils.hpp | 2 ++
>> kernel-shark/src/plugins/CMakeLists.txt | 2 +-
>> 3 files changed, 32 insertions(+), 12 deletions(-)
>>
>
> Hi Yordan,
>
> After applying this patch, kernelshark's behavior for loading trace.dat
> changed. It no longer looks for the file in the current directory. If I
> run:
>
> # trace-cmd record -e sched_switch sleep 1
> # kernelshark
>
> It loads without loading the produced trace.dat.
>
> If I run:
>
> # kernelshark trace.dat
>
> I get an error message stating:
>
> "Unable to find file trace.dat"
I see the problem. Have you pushed this patch already? I can send you a
corrected version of the patch or a separate patch with the fix.
Thanks!
Yordan
>
> -- Steve
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 3/8] kernel-shark: Add logic for the plugins search path
2019-05-04 8:27 ` Yordan Karadzhov (VMware)
@ 2019-05-04 11:31 ` Steven Rostedt
0 siblings, 0 replies; 13+ messages in thread
From: Steven Rostedt @ 2019-05-04 11:31 UTC (permalink / raw)
To: Yordan Karadzhov (VMware), Yordan Karadzhov
Cc: linux-trace-devel, troyengel, Slavomir Kaslev
On May 4, 2019 4:27:47 AM EDT, "Yordan Karadzhov (VMware)" <y.karadz@gmail.com> wrote:
>
>I see the problem. Have you pushed this patch already? I can send you a
>
>corrected version of the patch or a separate patch with the fix.
>
I have not pushed yet. Please send a new version of this patch.
Thanks,
-- Steve
--
Sent from my Android device with K-9 Mail. Please excuse my brevity and top posting.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 3/8] kernel-shark: Add logic for the plugins search path
2019-05-03 23:05 ` Steven Rostedt
2019-05-04 8:27 ` Yordan Karadzhov (VMware)
@ 2019-05-04 8:28 ` Yordan Karadzhov (VMware)
1 sibling, 0 replies; 13+ messages in thread
From: Yordan Karadzhov (VMware) @ 2019-05-04 8:28 UTC (permalink / raw)
To: Steven Rostedt, Yordan Karadzhov
Cc: linux-trace-devel, troyengel, Slavomir Kaslev
On 4.05.19 г. 2:05 ч., Steven Rostedt wrote:
> On Thu, 2 May 2019 15:40:04 +0300
> Yordan Karadzhov <ykaradzhov@vmware.com> wrote:
>
>> If the application has not been started from its installation location
>> and the the directory
>>
>> app_file_path + "../../kernel-shark/lib"
>>
>> exists, all build-in plugins will be loaded from this directory. In any
>> other case all build-in plugins will be loaded from
>>
>> _INSTALL_PREFIX/lib/kshark/plugins/
>>
>> Suggested-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
>> Reviewed-by: Slavomir Kaslev <kaslevs@vmware.com>
>> Signed-off-by: Yordan Karadzhov <ykaradzhov@vmware.com>
>> ---
>> kernel-shark/src/KsUtils.cpp | 40 ++++++++++++++++++-------
>> kernel-shark/src/KsUtils.hpp | 2 ++
>> kernel-shark/src/plugins/CMakeLists.txt | 2 +-
>> 3 files changed, 32 insertions(+), 12 deletions(-)
>>
>
> Hi Yordan,
>
> After applying this patch, kernelshark's behavior for loading trace.dat
> changed. It no longer looks for the file in the current directory. If I
> run:
>
> # trace-cmd record -e sched_switch sleep 1
> # kernelshark
>
> It loads without loading the produced trace.dat.
>
> If I run:
>
> # kernelshark trace.dat
>
> I get an error message stating:
>
> "Unable to find file trace.dat"
I see the problem. Have you pushed this patch already? I can send you a
corrected version of the patch or a separate patch with the fix.
Thanks!
Yordan
>
> -- Steve
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 4/8] kernel-shark: Remove the definition of KS_DIR
2019-05-02 12:40 [PATCH v2 0/8] Modifications needed for KS 1.0 Yordan Karadzhov
` (2 preceding siblings ...)
2019-05-02 12:40 ` [PATCH v2 3/8] kernel-shark: Add logic for the plugins search path Yordan Karadzhov
@ 2019-05-02 12:40 ` Yordan Karadzhov
2019-05-02 12:40 ` [PATCH v2 5/8] kernel-shark: Remember the paths used by the Open-File dialogs Yordan Karadzhov
` (3 subsequent siblings)
7 siblings, 0 replies; 13+ messages in thread
From: Yordan Karadzhov @ 2019-05-02 12:40 UTC (permalink / raw)
To: rostedt
Cc: linux-trace-devel, y.karadz, troyengel, Yordan Karadzhov,
Slavomir Kaslev
KS_DIR is no longer used, so we do not need to define it in the
Cmake-generated header file.
Reviewed-by: Slavomir Kaslev <kaslevs@vmware.com>
Signed-off-by: Yordan Karadzhov <ykaradzhov@vmware.com>
---
kernel-shark/build/deff.h.cmake | 3 ---
1 file changed, 3 deletions(-)
diff --git a/kernel-shark/build/deff.h.cmake b/kernel-shark/build/deff.h.cmake
index ba211f4..1cf8a80 100644
--- a/kernel-shark/build/deff.h.cmake
+++ b/kernel-shark/build/deff.h.cmake
@@ -11,9 +11,6 @@
/** KernelShark Version number. */
#cmakedefine KS_VERSION_STRING "@KS_VERSION_STRING@"
-/** KernelShark source code path. */
-#cmakedefine KS_DIR "@KS_DIR@"
-
/** KernelShark installation prefix path. */
#cmakedefine _INSTALL_PREFIX "@_INSTALL_PREFIX@"
--
2.20.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 5/8] kernel-shark: Remember the paths used by the Open-File dialogs
2019-05-02 12:40 [PATCH v2 0/8] Modifications needed for KS 1.0 Yordan Karadzhov
` (3 preceding siblings ...)
2019-05-02 12:40 ` [PATCH v2 4/8] kernel-shark: Remove the definition of KS_DIR Yordan Karadzhov
@ 2019-05-02 12:40 ` Yordan Karadzhov
2019-05-02 12:40 ` [PATCH v2 6/8] kernel-shark: Add logic for selecting the trace-cmd executable used Yordan Karadzhov
` (2 subsequent siblings)
7 siblings, 0 replies; 13+ messages in thread
From: Yordan Karadzhov @ 2019-05-02 12:40 UTC (permalink / raw)
To: rostedt
Cc: linux-trace-devel, y.karadz, troyengel, Yordan Karadzhov,
Slavomir Kaslev
The application will remember the used file paths across different
executions.
Suggested-by: Slavomir Kaslev <kaslevs@vmware.com>
Signed-off-by: Yordan Karadzhov <ykaradzhov@vmware.com>
---
kernel-shark/src/KsMainWindow.cpp | 11 ++++++++++-
kernel-shark/src/KsMainWindow.hpp | 2 ++
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/kernel-shark/src/KsMainWindow.cpp b/kernel-shark/src/KsMainWindow.cpp
index 748bacd..5f326f5 100644
--- a/kernel-shark/src/KsMainWindow.cpp
+++ b/kernel-shark/src/KsMainWindow.cpp
@@ -67,7 +67,8 @@ KsMainWindow::KsMainWindow(QWidget *parent)
_fullScreenModeAction("Full Screen Mode", this),
_aboutAction("About", this),
_contentsAction("Contents", this),
- _deselectShortcut(this)
+ _deselectShortcut(this),
+ _settings("kernelshark.org", "Kernel Shark") // organization , application
{
setWindowTitle("Kernel Shark");
_createActions();
@@ -126,6 +127,10 @@ KsMainWindow::KsMainWindow(QWidget *parent)
connect(&_mState, &KsDualMarkerSM::deselectB,
this, &KsMainWindow::_deselectB);
+ _lastDataFilePath = _settings.value("dataPath").toString();
+ _lastConfFilePath = _settings.value("confPath").toString();
+ _lastPluginFilePath = _settings.value("pluginPath").toString();
+
_resizeEmpty();
}
@@ -143,6 +148,10 @@ KsMainWindow::~KsMainWindow()
_session.getConfDocPtr());
}
+ _settings.setValue("dataPath", _lastDataFilePath);
+ _settings.setValue("confPath", _lastConfFilePath);
+ _settings.setValue("pluginPath", _lastPluginFilePath);
+
_data.clear();
if (kshark_instance(&kshark_ctx))
diff --git a/kernel-shark/src/KsMainWindow.hpp b/kernel-shark/src/KsMainWindow.hpp
index 2bf3285..962de2d 100644
--- a/kernel-shark/src/KsMainWindow.hpp
+++ b/kernel-shark/src/KsMainWindow.hpp
@@ -155,6 +155,8 @@ private:
QString _lastDataFilePath, _lastConfFilePath, _lastPluginFilePath;
+ QSettings _settings;
+
void _open();
void _restoreSession();
--
2.20.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 6/8] kernel-shark: Add logic for selecting the trace-cmd executable used
2019-05-02 12:40 [PATCH v2 0/8] Modifications needed for KS 1.0 Yordan Karadzhov
` (4 preceding siblings ...)
2019-05-02 12:40 ` [PATCH v2 5/8] kernel-shark: Remember the paths used by the Open-File dialogs Yordan Karadzhov
@ 2019-05-02 12:40 ` Yordan Karadzhov
2019-05-02 12:40 ` [PATCH v2 7/8] kernel-shark: Remove hard-coded install paths for libraries and plugins Yordan Karadzhov
2019-05-02 12:40 ` [PATCH v2 8/8] kernel-shark: Use XDG compliant path when saving cached data Yordan Karadzhov
7 siblings, 0 replies; 13+ messages in thread
From: Yordan Karadzhov @ 2019-05-02 12:40 UTC (permalink / raw)
To: rostedt; +Cc: linux-trace-devel, y.karadz, troyengel, Yordan Karadzhov
If kshark-record has been started from its installation location it will
use the installed version of trace-cmd. Otherwise the trace-cmd executable
found by Cmake when building KernelShark (see FindTraceCmd.cmake) will be
used.
Suggested-by: Troy Engel <troyengel@gmail.com>
Signed-off-by: Yordan Karadzhov <ykaradzhov@vmware.com>
---
kernel-shark/src/KsCaptureDialog.cpp | 7 ++++++-
kernel-shark/src/KsUtils.cpp | 4 ++--
kernel-shark/src/KsUtils.hpp | 2 ++
3 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/kernel-shark/src/KsCaptureDialog.cpp b/kernel-shark/src/KsCaptureDialog.cpp
index 2976a3b..b107595 100644
--- a/kernel-shark/src/KsCaptureDialog.cpp
+++ b/kernel-shark/src/KsCaptureDialog.cpp
@@ -473,7 +473,7 @@ KsCaptureDialog::KsCaptureDialog(QWidget *parent)
_captureMon(this),
_captureProc(this)
{
- QString captureExe(TRACECMD_BIN_DIR);
+ QString captureExe;
this->setWindowTitle("Capture");
_layout.addWidget(&_captureCtrl);
@@ -489,6 +489,11 @@ KsCaptureDialog::KsCaptureDialog(QWidget *parent)
connect(&_captureCtrl._closeButton, &QPushButton::pressed,
this, &KsCaptureDialog::close);
+ if (KsUtils::isInstalled())
+ captureExe = QString(_INSTALL_PREFIX) + QString("/bin");
+ else
+ captureExe = TRACECMD_BIN_DIR;
+
captureExe += "/trace-cmd";
_captureProc.setProgram(captureExe);
diff --git a/kernel-shark/src/KsUtils.cpp b/kernel-shark/src/KsUtils.cpp
index f62e53a..ee481bf 100644
--- a/kernel-shark/src/KsUtils.cpp
+++ b/kernel-shark/src/KsUtils.cpp
@@ -142,10 +142,10 @@ bool matchCPUVisible(struct kshark_context *kshark_ctx,
*/
bool isInstalled()
{
- QString appPath = QCoreApplication::applicationFilePath();
+ QString appPath = QCoreApplication::applicationDirPath();
QString installPath(_INSTALL_PREFIX);
- installPath += "/bin/kernelshark";
+ installPath += "/bin";
installPath = QDir::cleanPath(installPath);
return appPath == installPath;
diff --git a/kernel-shark/src/KsUtils.hpp b/kernel-shark/src/KsUtils.hpp
index 1c87271..b4663da 100644
--- a/kernel-shark/src/KsUtils.hpp
+++ b/kernel-shark/src/KsUtils.hpp
@@ -112,6 +112,8 @@ inline QString Ts2String(int64_t ts, int prec)
bool matchCPUVisible(struct kshark_context *kshark_ctx,
struct kshark_entry *e, int cpu);
+bool isInstalled();
+
QString getFile(QWidget *parent,
const QString &windowName,
const QString &filter,
--
2.20.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 7/8] kernel-shark: Remove hard-coded install paths for libraries and plugins
2019-05-02 12:40 [PATCH v2 0/8] Modifications needed for KS 1.0 Yordan Karadzhov
` (5 preceding siblings ...)
2019-05-02 12:40 ` [PATCH v2 6/8] kernel-shark: Add logic for selecting the trace-cmd executable used Yordan Karadzhov
@ 2019-05-02 12:40 ` Yordan Karadzhov
2019-05-02 12:40 ` [PATCH v2 8/8] kernel-shark: Use XDG compliant path when saving cached data Yordan Karadzhov
7 siblings, 0 replies; 13+ messages in thread
From: Yordan Karadzhov @ 2019-05-02 12:40 UTC (permalink / raw)
To: rostedt; +Cc: linux-trace-devel, y.karadz, troyengel, Yordan Karadzhov
The definition of KS_APP_NAME is used to derive standard installation
paths for the KernelShark libraries and plugins.
Suggested-by: Troy Engel <troyengel@gmail.com>
Signed-off-by: Yordan Karadzhov <ykaradzhov@vmware.com>
---
kernel-shark/CMakeLists.txt | 7 +++++--
kernel-shark/build/deff.h.cmake | 3 +++
kernel-shark/src/CMakeLists.txt | 12 ++++++------
kernel-shark/src/KsUtils.cpp | 4 ++--
kernel-shark/src/plugins/CMakeLists.txt | 3 +--
5 files changed, 17 insertions(+), 12 deletions(-)
diff --git a/kernel-shark/CMakeLists.txt b/kernel-shark/CMakeLists.txt
index 1aee858..64f7de8 100644
--- a/kernel-shark/CMakeLists.txt
+++ b/kernel-shark/CMakeLists.txt
@@ -4,6 +4,7 @@ cmake_minimum_required(VERSION 2.8.11 FATAL_ERROR)
# Set the name and version of the project
project(kernel-shark)
+set(KS_APP_NAME "kernelshark")
set(KS_VERSION_MAJOR 0)
set(KS_VERSION_MINOR 9)
set(KS_VERSION_PATCH 8)
@@ -39,6 +40,8 @@ if(NOT _INSTALL_PREFIX)
set(_INSTALL_PREFIX "/usr/local")
endif()
+set(KS_PLUGIN_INSTALL_PREFIX ${_INSTALL_PREFIX}/lib/${KS_APP_NAME}/plugins/)
+
if (NOT _DEBUG)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
@@ -46,7 +49,7 @@ if (NOT _DEBUG)
endif (NOT _DEBUG)
-SET(CMAKE_INSTALL_RPATH "${_INSTALL_PREFIX}/lib/kshark/")
+SET(CMAKE_INSTALL_RPATH "${_INSTALL_PREFIX}/lib/${KS_APP_NAME}/")
SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
include_directories(${KS_DIR}/src/
@@ -79,7 +82,7 @@ if (_DOXYGEN_DOC AND DOXYGEN_FOUND)
endif ()
configure_file( ${KS_DIR}/build/ks.desktop.cmake
- ${KS_DIR}/kernelshark.desktop)
+ ${KS_DIR}/${KS_APP_NAME}.desktop)
configure_file( ${KS_DIR}/build/org.freedesktop.kshark-record.policy.cmake
${KS_DIR}/org.freedesktop.kshark-record.policy)
diff --git a/kernel-shark/build/deff.h.cmake b/kernel-shark/build/deff.h.cmake
index 1cf8a80..efee2a1 100644
--- a/kernel-shark/build/deff.h.cmake
+++ b/kernel-shark/build/deff.h.cmake
@@ -14,6 +14,9 @@
/** KernelShark installation prefix path. */
#cmakedefine _INSTALL_PREFIX "@_INSTALL_PREFIX@"
+/** KernelShark plugins installation prefix path. */
+#cmakedefine KS_PLUGIN_INSTALL_PREFIX "@KS_PLUGIN_INSTALL_PREFIX@"
+
/** Location of the trace-cmd executable. */
#cmakedefine TRACECMD_BIN_DIR "@TRACECMD_BIN_DIR@"
diff --git a/kernel-shark/src/CMakeLists.txt b/kernel-shark/src/CMakeLists.txt
index b7dbd7e..2f28cae 100644
--- a/kernel-shark/src/CMakeLists.txt
+++ b/kernel-shark/src/CMakeLists.txt
@@ -69,19 +69,19 @@ if (Qt5Widgets_FOUND AND Qt5Network_FOUND)
set_target_properties(kshark-gui PROPERTIES SUFFIX ".so.${KS_VERSION_STRING}")
- message(STATUS "kernelshark")
- add_executable(kernelshark kernelshark.cpp)
- target_link_libraries(kernelshark kshark-gui)
+ message(STATUS ${KS_APP_NAME})
+ add_executable(${KS_APP_NAME} kernelshark.cpp)
+ target_link_libraries(${KS_APP_NAME} kshark-gui)
message(STATUS "kshark-record")
add_executable(kshark-record kshark-record.cpp)
target_link_libraries(kshark-record kshark-gui)
- install(TARGETS kernelshark kshark-record kshark kshark-plot kshark-gui
+ install(TARGETS ${KS_APP_NAME} kshark-record kshark kshark-plot kshark-gui
RUNTIME DESTINATION ${_INSTALL_PREFIX}/bin/
- LIBRARY DESTINATION ${_INSTALL_PREFIX}/lib/kshark/)
+ LIBRARY DESTINATION ${_INSTALL_PREFIX}/lib/${KS_APP_NAME}/)
- install(FILES "${KS_DIR}/kernelshark.desktop"
+ install(FILES "${KS_DIR}/${KS_APP_NAME}.desktop"
DESTINATION /usr/share/applications/)
install(FILES "${KS_DIR}/org.freedesktop.kshark-record.policy"
diff --git a/kernel-shark/src/KsUtils.cpp b/kernel-shark/src/KsUtils.cpp
index ee481bf..e2091be 100644
--- a/kernel-shark/src/KsUtils.cpp
+++ b/kernel-shark/src/KsUtils.cpp
@@ -621,8 +621,8 @@ char *KsPluginManager::_pluginLibFromName(const QString &plugin, int &n)
n = asprintf(&lib, "%s/plugin-%s.so",
pathStr.c_str(), pluginStr.c_str());
} else {
- n = asprintf(&lib, "%s/lib/kshark/plugins/plugin-%s.so",
- _INSTALL_PREFIX, pluginStr.c_str());
+ n = asprintf(&lib, "%s/plugin-%s.so",
+ KS_PLUGIN_INSTALL_PREFIX, pluginStr.c_str());
}
return lib;
diff --git a/kernel-shark/src/plugins/CMakeLists.txt b/kernel-shark/src/plugins/CMakeLists.txt
index 64cf98d..6c77179 100644
--- a/kernel-shark/src/plugins/CMakeLists.txt
+++ b/kernel-shark/src/plugins/CMakeLists.txt
@@ -18,7 +18,6 @@ function(BUILD_PLUGIN)
endfunction()
set(PLUGIN_LIST "")
-
BUILD_PLUGIN(NAME sched_events
SOURCE sched_events.c SchedEvents.cpp)
list(APPEND PLUGIN_LIST "sched_events default") # This plugin will be loaded by default
@@ -29,6 +28,6 @@ BUILD_PLUGIN(NAME missed_events
list(APPEND PLUGIN_LIST "missed_events default") # This plugin will be loaded by default
install(TARGETS sched_events missed_events
- LIBRARY DESTINATION ${_INSTALL_PREFIX}/lib/kshark/plugins/)
+ LIBRARY DESTINATION ${KS_PLUGIN_INSTALL_PREFIX})
set(PLUGINS ${PLUGIN_LIST} PARENT_SCOPE)
--
2.20.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 8/8] kernel-shark: Use XDG compliant path when saving cached data
2019-05-02 12:40 [PATCH v2 0/8] Modifications needed for KS 1.0 Yordan Karadzhov
` (6 preceding siblings ...)
2019-05-02 12:40 ` [PATCH v2 7/8] kernel-shark: Remove hard-coded install paths for libraries and plugins Yordan Karadzhov
@ 2019-05-02 12:40 ` Yordan Karadzhov
7 siblings, 0 replies; 13+ messages in thread
From: Yordan Karadzhov @ 2019-05-02 12:40 UTC (permalink / raw)
To: rostedt; +Cc: linux-trace-devel, y.karadz, troyengel, Yordan Karadzhov
Use the QStandardPaths class provided by Qt in order to guarantee that
the location of the cached data is XDG compliant.
Suggested-by: Troy Engel <troyengel@gmail.com>
Signed-off-by: Yordan Karadzhov <ykaradzhov@vmware.com>
---
kernel-shark/src/KsMainWindow.cpp | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/kernel-shark/src/KsMainWindow.cpp b/kernel-shark/src/KsMainWindow.cpp
index 5f326f5..bb593bd 100644
--- a/kernel-shark/src/KsMainWindow.cpp
+++ b/kernel-shark/src/KsMainWindow.cpp
@@ -409,8 +409,10 @@ QString KsMainWindow::_getCacheDir()
if (!QDir(dir).exists())
lamMakePath(true);
} else {
- dir = QString(QDir::homePath()) +
- "/.cache/kernelshark";
+ auto appCachePath = QStandardPaths::GenericCacheLocation;
+ dir = QStandardPaths::writableLocation(appCachePath);
+ dir += "/kernelshark";
+
if (!QDir(dir).exists())
lamMakePath(false);
}
--
2.20.1
^ permalink raw reply related [flat|nested] 13+ messages in thread