aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYordan Karadzhov (VMware) <y.karadz@gmail.com>2021-02-11 12:31:52 +0200
committerYordan Karadzhov (VMware) <y.karadz@gmail.com>2021-02-16 10:25:14 +0200
commit192d15f1237ac86aa9f527e15c60556f1e47fd49 (patch)
tree6a3104f1fbe2f113afa65aeb9bff02ba9fbc0bd8
parentdcd728b073c2434c3fbc3c7eb3d1855011302b01 (diff)
downloadkernel-shark-192d15f1237ac86aa9f527e15c60556f1e47fd49.tar.gz
kernel-shark: Update the plotting example
The compilation of the plotting example is re-enabled and it is made compatible with the new version of the C API of libkshark (KernelShark 2.0). Link: https://lore.kernel.org/linux-trace-devel/20210211103205.418588-15-y.karadz@gmail.com Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
-rw-r--r--examples/CMakeLists.txt6
-rw-r--r--examples/dataplot.cpp88
2 files changed, 63 insertions, 31 deletions
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index 83608414..e6af5f2c 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -20,9 +20,9 @@ message(STATUS "confogio")
add_executable(confio configio.c)
target_link_libraries(confio kshark)
-# message(STATUS "dataplot")
-# add_executable(dplot dataplot.cpp)
-# target_link_libraries(dplot kshark-plot)
+message(STATUS "dataplot")
+add_executable(dplot dataplot.cpp)
+target_link_libraries(dplot kshark-plot)
if (Qt5Widgets_FOUND)
diff --git a/examples/dataplot.cpp b/examples/dataplot.cpp
index 94841e79..b3ff29ff 100644
--- a/examples/dataplot.cpp
+++ b/examples/dataplot.cpp
@@ -10,6 +10,7 @@
// C++
#include <vector>
#include <iostream>
+#include <sstream>
// OpenGL
#include <GL/freeglut.h>
@@ -20,25 +21,29 @@
using namespace std;
-#define GRAPH_HEIGHT 40 // width of the graph in pixels
-#define GRAPH_H_MARGIN 50 // size of the white space surrounding the graph
-#define WINDOW_WIDTH 800 // width of the screen window in pixels
-#define WINDOW_HEIGHT 480 // height of the scrren window in pixels
+#define GRAPH_HEIGHT 40 // width of the graph in pixels
+#define GRAPH_H_MARGIN 15 // size of the white space surrounding
+ // the graph
+#define GRAPH_LABEL_WIDTH 80 // width of the graph's label in pixels
+#define WINDOW_WIDTH 800 // width of the screen window in pixels
+#define WINDOW_HEIGHT 480 // height of the scrren window in pixels
#define default_file (char*)"trace.dat"
struct kshark_trace_histo histo;
vector<KsPlot::Graph *> graphs;
+struct ksplot_font font;
+int stream_id;
void usage(const char *prog)
{
cout << "Usage: " << prog << endl;
- cout << " -h Display this help message\n";
+ cout << " -h Display this help message.\n";
cout << " -s Draw shapes. This demonstrates how to draw simple "
<< "geom. shapes.\n";
cout << " -i <file> Input file and draw animated graphs.\n";
cout << " No args. Import " << default_file
- << "and draw animated graphs.\n";
+ << " and draw animated graphs.\n";
}
/* An example function drawing something. */
@@ -57,6 +62,11 @@ void drawShapes()
t._color = {100, 200, 50};
t.draw();
+ /* Print/draw "Hello Kernel!". */
+ KsPlot::Color col = {50, 150, 255};
+ KsPlot::TextBox tb(&font, "Hello Kernel!", col, {250, 70}, 250);
+ tb.draw();
+
KsPlot::Rectangle r;
KsPlot::Point d(400, 200), e(400, 300), f(500, 300), g(500, 200);
r.setPoint(0, d);
@@ -78,13 +88,14 @@ void drawShapes()
/* An example function demonstrating Zoom In and Zoom Out. */
void play()
{
- KsPlot::ColorTable taskColors = KsPlot::getTaskColorTable();
- KsPlot::ColorTable cpuColors = KsPlot::getCPUColorTable();
+ KsPlot::ColorTable taskColors = KsPlot::taskColorTable();
+ KsPlot::ColorTable cpuColors = KsPlot::CPUColorTable();
vector<KsPlot::Graph *>::iterator it;
+ KsPlot::Graph *graph;
vector<int> CPUs, Tasks;
bool zoomIn(true);
int base;
- size_t i;
+ size_t i(1);
CPUs = {3, 4, 6};
Tasks = {}; // Add valid pids here, if you want task plots.
@@ -92,35 +103,47 @@ void play()
auto lamAddGraph = [&] (KsPlot::Graph *g) {
/* Set the dimensions of the Graph. */
g->setHeight(GRAPH_HEIGHT);
- g->setHMargin(GRAPH_H_MARGIN);
/*
* Set the Y coordinate of the Graph's base.
* Remember that the "Y" coordinate is inverted.
*/
- base = 1.7 * GRAPH_HEIGHT * (i + 1);
+ base = 1.7 * GRAPH_HEIGHT * (i++);
g->setBase(base);
+ g->setLabelAppearance(&font, {160, 255, 255}, GRAPH_LABEL_WIDTH,
+ GRAPH_H_MARGIN);
+
/* Add the Graph. */
graphs.push_back(g);
};
- for (i = 0; i < CPUs.size(); ++i)
- lamAddGraph(new KsPlot::Graph(&histo, &taskColors,
- &taskColors));
+ for (auto const &cpu: CPUs) {
+ std::stringstream ss;
+ ss << "CPU " << cpu;
+
+ graph = new KsPlot::Graph(&histo, &taskColors, &taskColors);
+ graph->setLabelText(ss.str());
+ lamAddGraph(graph);
+ }
+
+ for (auto const &pid: Tasks) {
+ std::stringstream ss;
+ ss << "PID " << pid;
- for (;i < CPUs.size() + Tasks.size(); ++i)
- lamAddGraph(new KsPlot::Graph(&histo, &taskColors,
- &cpuColors));
+ graph = new KsPlot::Graph(&histo, &taskColors, &cpuColors);
+ graph->setLabelText(ss.str());
+ lamAddGraph(graph);
+ }
for (i = 1; i < 1000; ++i) {
it = graphs.begin();
for (int const &cpu: CPUs)
- (*it++)->fillCPUGraph(cpu);
+ (*it++)->fillCPUGraph(stream_id, cpu);
for (int const &pid: Tasks)
- (*it++)->fillTaskGraph(pid);
+ (*it++)->fillTaskGraph(stream_id, pid);
/* Clear the screen. */
glClear(GL_COLOR_BUFFER_BIT);
@@ -146,7 +169,8 @@ int main(int argc, char **argv)
struct kshark_context *kshark_ctx(nullptr);
struct kshark_entry **data(nullptr);
static char *input_file(nullptr);
- bool status, shapes(false);
+ bool shapes(false);
+ char *font_file;
size_t r, nRows;
int c, nBins;
@@ -166,11 +190,20 @@ int main(int argc, char **argv)
}
}
+ font_file = ksplot_find_font_file("FreeMono", "FreeMonoBold");
+ if (!font_file)
+ return 1;
+
auto lamDraw = [&] (void (*func)(void)) {
- /* Initialize OpenGL/Glut. */
+ /* Initialize Glut. */
glutInit(&argc, argv);
ksplot_make_scene(WINDOW_WIDTH, WINDOW_HEIGHT);
+
+ /* Initialize OpenGL. */
ksplot_init_opengl(1);
+ ksplot_resize_opengl(WINDOW_WIDTH, WINDOW_HEIGHT);
+
+ ksplot_init_font(&font, 18, font_file);
/* Display something. */
glutDisplayFunc(func);
@@ -191,8 +224,8 @@ int main(int argc, char **argv)
if (!input_file)
input_file = default_file;
- status = kshark_open(kshark_ctx, input_file);
- if (!status) {
+ stream_id = kshark_open(kshark_ctx, input_file);
+ if (stream_id < 0) {
kshark_free(kshark_ctx);
usage(argv[0]);
cerr << "\nFailed to open file " << input_file << endl;
@@ -201,12 +234,12 @@ int main(int argc, char **argv)
}
/* Load the content of the file into an array of entries. */
- nRows = kshark_load_data_entries(kshark_ctx, &data);
+ nRows = kshark_load_entries(kshark_ctx, stream_id, &data);
/* Initialize the Visualization Model. */
ksmodel_init(&histo);
- nBins = WINDOW_WIDTH - 2 * GRAPH_HEIGHT;
+ nBins = WINDOW_WIDTH - GRAPH_LABEL_WIDTH - 3 * GRAPH_H_MARGIN;
ksmodel_set_bining(&histo, nBins, data[0]->ts,
data[nRows - 1]->ts);
@@ -216,6 +249,8 @@ int main(int argc, char **argv)
/* Play animated Graph. */
lamDraw(play);
+ free(font_file);
+
/* Free the memory. */
for (auto &g: graphs)
delete g;
@@ -227,9 +262,6 @@ int main(int argc, char **argv)
/* Reset (clear) the model. */
ksmodel_clear(&histo);
- /* Close the file. */
- kshark_close(kshark_ctx);
-
/* Close the session. */
kshark_free(kshark_ctx);