diff --git a/kernel-shark-qt/examples/CMakeLists.txt b/kernel-shark-qt/examples/CMakeLists.txt index e16216e..ae1331c 100644 --- a/kernel-shark-qt/examples/CMakeLists.txt +++ b/kernel-shark-qt/examples/CMakeLists.txt @@ -23,3 +23,7 @@ target_link_libraries(dplot kshark-plot) message(STATUS "widgetdemo") add_executable(widgetdemo widgetdemo.cpp) target_link_libraries(widgetdemo kshark-gui) + +message(STATUS "mtread") +add_executable(mtread mt_read.cpp) +target_link_libraries(mtread kshark-gui) diff --git a/kernel-shark-qt/examples/mt_read.cpp b/kernel-shark-qt/examples/mt_read.cpp index e69de29..0419454 100644 --- a/kernel-shark-qt/examples/mt_read.cpp +++ b/kernel-shark-qt/examples/mt_read.cpp @@ -0,0 +1,82 @@ +// C +#include +#include + +// C++ +#include +#include + +// KernelShark +#include "libkshark.h" + +using namespace std; + +const char *default_file = "trace.dat"; + +static void read_job(struct kshark_context *kshark_ctx, + struct kshark_entry **data, + size_t first, size_t last) +{ + struct tep_record *rec; + + for (size_t r = first; r < last; ++r) { + rec = kshark_read_at(kshark_ctx, data[r]->offset); + free(rec); + } +} + +int main(int argc, char **argv) +{ + int nThreads = std::thread::hardware_concurrency(); + struct kshark_context *kshark_ctx; + struct kshark_entry **data = NULL; + size_t r, n_rows; + int first, last, delta; + bool status; + + /* Create a new kshark session. */ + kshark_ctx = NULL; + if (!kshark_instance(&kshark_ctx)) + return 1; + + /* Open a trace data file produced by trace-cmd. */ + if (argc > 1) + status = kshark_open(kshark_ctx, argv[1]); + else + status = kshark_open(kshark_ctx, default_file); + + if (!status) { + kshark_free(kshark_ctx); + return 1; + } + + /* Load the content of the file into an array of entries. */ + n_rows = kshark_load_data_entries(kshark_ctx, &data); + +// nThreads = 1; + delta = n_rows / nThreads; + vector threads; + for (int i = 0; i < nThreads; ++i) { + first = i * delta; + last = first + delta - 1; + threads.push_back(thread(read_job, kshark_ctx, data, first, last)); +// threads.push_back(thread(read_job, kshark_ctx, data, 0, n_rows)); + } + + for (auto &t:threads) + t.join(); + + /* Free the memory. */ + for (r = 0; r < n_rows; ++r) + free(data[r]); + + free(data); + + /* Close the file. */ + kshark_close(kshark_ctx); + + /* Close the session. */ + kshark_free(kshark_ctx); + + return 0; +}