aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYordan Karadzhov (VMware) <y.karadz@gmail.com>2021-05-17 17:21:34 +0300
committerYordan Karadzhov (VMware) <y.karadz@gmail.com>2021-05-18 10:52:15 +0300
commit54515fee9f57120d68c305881561e8657e7e2c64 (patch)
treeb7fc5423874c7b6dc9a9fc52177ff14a2a63772c
parent60b5c2f8bd56b9db968f960802727eceb07b534f (diff)
downloadkernel-shark-54515fee9f57120d68c305881561e8657e7e2c64.tar.gz
kernel-shark: Preserve markers when appending data
When an entry is selected in the KernelShark GUI (using marker A and marker B) we only keep track the index of this entry inside the array of entries loaded at the moment of selecting. However, then a data file is appended, the new entries are merged to this array and the array is sorted. As a result the index of the marker can/will point to completely different entry. Link: https://lore.kernel.org/linux-trace-devel/20210517142140.286153-2-y.karadz@gmail.com Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
-rw-r--r--src/KsDualMarker.hpp6
-rw-r--r--src/KsMainWindow.cpp24
2 files changed, 28 insertions, 2 deletions
diff --git a/src/KsDualMarker.hpp b/src/KsDualMarker.hpp
index 0dcaf936..39c0ce29 100644
--- a/src/KsDualMarker.hpp
+++ b/src/KsDualMarker.hpp
@@ -154,6 +154,12 @@ public:
void updateLabels();
+ /** Get the index inside the data array marker A points to. */
+ ssize_t markerAPos() {return markerA()._isSet ? markerA()._pos : -1;}
+
+ /** Get the index inside the data array marker B points to. */
+ ssize_t markerBPos() {return markerB()._isSet ? markerB()._pos : -1;}
+
signals:
/**
* This signal is emitted when the Table View has to switch the color
diff --git a/src/KsMainWindow.cpp b/src/KsMainWindow.cpp
index d0a434af..fa893ce2 100644
--- a/src/KsMainWindow.cpp
+++ b/src/KsMainWindow.cpp
@@ -571,8 +571,15 @@ void KsMainWindow::markEntry(ssize_t row, DualMarkerState st)
/** Select given kshark_entry with a given maker. */
void KsMainWindow::markEntry(const kshark_entry *e, DualMarkerState st)
{
- ssize_t row = kshark_find_entry_by_time(e->ts, _data.rows(),
- 0, _data.size() - 1);
+ ssize_t row;
+
+ if (!e) {
+ _mState.getMarker(st).reset();
+ return;
+ }
+
+ row = kshark_find_entry_by_time(e->ts, _data.rows(),
+ 0, _data.size() - 1);
markEntry(row, st);
}
@@ -1341,7 +1348,20 @@ void KsMainWindow::loadDataFile(const QString& fileName)
/** Append trace data for file. */
void KsMainWindow::appendDataFile(const QString& fileName)
{
+ kshark_entry *eMarkA(nullptr), *eMarkB(nullptr);
+ int rowA = _mState.markerAPos();
+ int rowB = _mState.markerBPos();
+
+ if (rowA >= 0)
+ eMarkA = _data.rows()[rowA];
+
+ if (rowB >= 0)
+ eMarkB = _data.rows()[rowB];
+
_load(fileName, true);
+
+ markEntry(eMarkA, DualMarkerState::A);
+ markEntry(eMarkB, DualMarkerState::B);
}
void KsMainWindow::_error(const QString &mesg,