@@ -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
@@ -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,
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. Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com> --- src/KsDualMarker.hpp | 6 ++++++ src/KsMainWindow.cpp | 24 ++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-)