@@ -79,9 +79,19 @@ bool KsGraphMark::set(const KsDataStore &data,
kshark_trace_histo *histo,
size_t pos, int cpuGraph, int taskGraph)
{
+ uint8_t visFlags;
+
_isSet = true;
_pos = pos;
_ts = data.rows()[_pos]->ts;
+ visFlags = data.rows()[_pos]->visible;
+
+ if ((visFlags & KS_TEXT_VIEW_FILTER_MASK) &&
+ (visFlags & KS_GRAPH_VIEW_FILTER_MASK))
+ _mark.setDashed(false);
+ else
+ _mark.setDashed(true);
+
_cpu = cpuGraph;
_task = taskGraph;
@@ -379,6 +379,32 @@ void drawLine(const Point &a, const Point &b,
size);
}
+/**
+ * @brief Draw a dashed line between point "a" and point "b".
+ *
+ * @param a: The first finishing point of the line.
+ * @param b: The second finishing point of the line.
+ * @param col: The color of the line.
+ * @param size: The size of the line.
+ * @param period: The period of the dashed line.
+ */
+void drawDashedLine(const Point &a, const Point &b,
+ const Color &col, float size, float period)
+{
+ int dx = b.x() - a.x(), dy = b.y() - a.y();
+ float mod = sqrt(dx * dx + dy * dy);
+ int n = mod / period;
+ Point p1, p2;
+
+ for (int i = 0; i < n; ++i) {
+ p1.setX(a.x() + (i + .25) * dx / n);
+ p1.setY(a.y() + (i + .25) * dy / n);
+ p2.setX(a.x() + (i + .75) * dx / n);
+ p2.setY(a.y() + (i + .75) * dy / n);
+ drawLine(p1, p2, col, size);
+ }
+}
+
/** @brief Create a default line. The two points are initialized at (0, 0). */
Line::Line()
: Shape(2)
@@ -430,6 +456,7 @@ void Polygon::_draw(const Color &col, float size) const
* @brief Create a default Mark.
*/
Mark::Mark()
+: _dashed(false)
{
_visible = false;
_cpu._color = Color(225, 255, 100);
@@ -440,7 +467,11 @@ Mark::Mark()
void Mark::_draw(const Color &col, float size) const
{
- drawLine(_a, _b, col, size);
+ if (_dashed)
+ drawDashedLine(_a, _b, col, size, 3 * _cpu._size / size);
+ else
+ drawLine(_a, _b, col, size);
+
_cpu.draw();
_task.draw();
}
@@ -204,7 +204,10 @@ private:
};
void drawLine(const Point &a, const Point &b,
- const Color &col, float s);
+ const Color &col, float size);
+
+void drawDashedLine(const Point &a, const Point &b,
+ const Color &col, float size, float period);
/** This class represents a straight line. */
class Line : public Shape {
@@ -326,6 +329,9 @@ public:
void setTaskVisible(bool v);
+ /** If True, the Mark will be plotted as a dashed line. */
+ void setDashed(bool d) {_dashed = d;}
+
private:
void _draw(const Color &col, float size = 1.) const override;
@@ -340,6 +346,9 @@ private:
/** A point indicating the position of the Mark in a Task graph. */
Point _task;
+
+ /* If True, plot the Mark as a dashed line. */
+ bool _dashed;
};
/** This class represents a KernelShark graph's bin. */
@@ -493,15 +493,19 @@ void KsTraceViewer::markSwitch()
QModelIndex index =
_proxyModel.mapFromSource(_model.index(row, 0));
- /*
- * The row of the active marker will be colored according to
- * the assigned property of the current state of the Dual
- * marker. Auto-scrolling is temporarily disabled because we
- * do not want to scroll to the position of the marker yet.
- */
- _view.setAutoScroll(false);
- _view.selectRow(index.row());
- _view.setAutoScroll(true);
+ if (index.isValid()) {
+ /*
+ * The row of the active marker will be colored according to
+ * the assigned property of the current state of the Dual
+ * marker. Auto-scrolling is temporarily disabled because we
+ * do not want to scroll to the position of the marker yet.
+ */
+ _view.setAutoScroll(false);
+ _view.selectRow(index.row());
+ _view.setAutoScroll(true);
+ } else {
+ _view.clearSelection();
+ }
} else {
_view.clearSelection();
}
Markers can point to entries that are filtered out. In such a case the filtered marker is plotted using a dashed line. Suggested-by: Steven Rostedt (VMware) <rostedt@goodmis.org> Signed-off-by: Yordan Karadzhov <ykaradzhov@vmware.com> --- kernel-shark/src/KsDualMarker.cpp | 10 +++++++++ kernel-shark/src/KsPlotTools.cpp | 33 +++++++++++++++++++++++++++++- kernel-shark/src/KsPlotTools.hpp | 11 +++++++++- kernel-shark/src/KsTraceViewer.cpp | 22 ++++++++++++-------- 4 files changed, 65 insertions(+), 11 deletions(-)