@@ -50,7 +50,9 @@ KsMainWindow::KsMainWindow(QWidget *parent)
_importFilterAction("Import Filter", this),
_exportFilterAction("Export Filter", this),
_graphFilterSyncAction(this),
+ _graphFilterSyncCBox(nullptr),
_listFilterSyncAction(this),
+ _listFilterSyncCBox(nullptr),
_showEventsAction("Show events", this),
_showTasksAction("Show tasks", this),
_hideTasksAction("Hide tasks", this),
@@ -273,7 +275,6 @@ void KsMainWindow::_createMenus()
{
QMenu *file, *sessions, *filter, *plots, *tools, *help;
kshark_context *kshark_ctx(nullptr);
- QCheckBox *cbf2g, *cbf2l;
if (!kshark_instance(&kshark_ctx))
return;
@@ -316,17 +317,17 @@ void KsMainWindow::_createMenus()
kshark_ctx->filter_mask |= KS_EVENT_VIEW_FILTER_MASK;
- cbf2g = lamMakeCBAction(&_graphFilterSyncAction,
- "Apply filters to Graph");
+ _graphFilterSyncCBox = lamMakeCBAction(&_graphFilterSyncAction,
+ "Apply filters to Graph");
- connect(cbf2g, &QCheckBox::stateChanged,
- this, &KsMainWindow::_graphFilterSync);
+ connect(_graphFilterSyncCBox, &QCheckBox::stateChanged,
+ this, &KsMainWindow::_graphFilterSync);
- cbf2l = lamMakeCBAction(&_listFilterSyncAction,
- "Apply filters to List");
+ _listFilterSyncCBox = lamMakeCBAction(&_listFilterSyncAction,
+ "Apply filters to List");
- connect(cbf2l, &QCheckBox::stateChanged,
- this, &KsMainWindow::_listFilterSync);
+ connect(_listFilterSyncCBox, &QCheckBox::stateChanged,
+ this, &KsMainWindow::_listFilterSync);
filter->addAction(&_graphFilterSyncAction);
filter->addAction(&_listFilterSyncAction);
@@ -431,6 +432,20 @@ void KsMainWindow::_exportSession()
_session.exportToFile(fileName);
}
+void KsMainWindow::_filterSyncCBoxUpdate(kshark_context *kshark_ctx)
+{
+ if (kshark_ctx->filter_mask & KS_TEXT_VIEW_FILTER_MASK)
+ _listFilterSyncCBox->setChecked(true);
+ else
+ _listFilterSyncCBox->setChecked(false);
+
+ if (kshark_ctx->filter_mask &
+ (KS_GRAPH_VIEW_FILTER_MASK | KS_EVENT_VIEW_FILTER_MASK))
+ _graphFilterSyncCBox->setChecked(true);
+ else
+ _graphFilterSyncCBox->setChecked(false);
+}
+
void KsMainWindow::_importFilter()
{
kshark_context *kshark_ctx(nullptr);
@@ -455,6 +470,7 @@ void KsMainWindow::_importFilter()
kshark_free_config_doc(conf);
kshark_filter_entries(kshark_ctx, _data.rows(), _data.size());
+ _filterSyncCBoxUpdate(kshark_ctx);
emit _data.updateWidgets(&_data);
}
@@ -960,6 +976,7 @@ void KsMainWindow::loadSession(const QString &fileName)
pb.setValue(20);
_session.loadFilters(kshark_ctx, &_data);
+ _filterSyncCBoxUpdate(kshark_ctx);
pb.setValue(130);
_session.loadSplitterSize(&_splitter);
@@ -112,8 +112,12 @@ private:
QWidgetAction _graphFilterSyncAction;
+ QCheckBox *_graphFilterSyncCBox;
+
QWidgetAction _listFilterSyncAction;
+ QCheckBox *_listFilterSyncCBox;
+
QAction _showEventsAction;
QAction _showTasksAction;
@@ -218,6 +222,8 @@ private:
void _deselect();
+ void _filterSyncCBoxUpdate(kshark_context *kshark_ctx);
+
private slots:
void _captureFinished(int, QProcess::ExitStatus);
};
@@ -1201,6 +1201,103 @@ bool kshark_import_adv_filters(struct kshark_context *kshark_ctx,
}
}
+static bool kshark_user_mask_to_json(struct kshark_context *kshark_ctx,
+ struct json_object *jobj)
+{
+ uint8_t mask = kshark_ctx->filter_mask;
+ json_object *jmask;
+
+ jmask = json_object_new_int((int) mask);
+ if (!jmask)
+ return false;
+
+ /* Add the mask to the filter config document. */
+ json_object_object_add(jobj, KS_USER_FILTER_MASK_NAME, jmask);
+ return true;
+}
+
+/**
+ * @brief Record the current value of the the user-specified filter mask into
+ * a Configuration document.
+ *
+ * @param kshark_ctx: Input location for session context pointer.
+ * @param conf: Input location for the kshark_config_doc instance. Currently
+ * only Json format is supported. If NULL, a new Adv. Filter
+ * Configuration document will be created.
+ *
+ * @returns True on success, otherwise False.
+ */
+bool kshark_export_user_mask(struct kshark_context *kshark_ctx,
+ struct kshark_config_doc **conf)
+{
+ if (!*conf)
+ *conf = kshark_filter_config_new(KS_CONFIG_JSON);
+
+ if (!*conf)
+ return false;
+
+ switch ((*conf)->format) {
+ case KS_CONFIG_JSON:
+ return kshark_user_mask_to_json(kshark_ctx,
+ (*conf)->conf_doc);
+
+ default:
+ fprintf(stderr, "Document format %d not supported\n",
+ (*conf)->format);
+ return false;
+ }
+}
+
+static bool kshark_user_mask_from_json(struct kshark_context *kshark_ctx,
+ struct json_object *jobj)
+{
+ json_object *jmask;
+ uint8_t mask;
+
+ if (!kshark_json_type_check(jobj, "kshark.config.filter"))
+ return false;
+ /*
+ * Use the name of the filter to find the value of the filter maks.
+ * Notice that the filter config document may contain no data for
+ * the mask.
+ */
+ if (!json_object_object_get_ex(jobj, KS_USER_FILTER_MASK_NAME,
+ &jmask))
+ return false;
+
+ mask = json_object_get_int(jmask);
+ kshark_ctx->filter_mask = mask;
+
+ return true;
+}
+
+/**
+ * @brief Load from Configuration document the value of the user-specified
+ * filter mask.
+ *
+ * @param kshark_ctx: Input location for session context pointer.
+ * @param conf: Input location for the kshark_config_doc instance. Currently
+ * only Json format is supported.
+ *
+ * @returns True, if a mask has been loaded. If the filter configuration
+ * document contains no data for the mask or in a case of an error,
+ * the function returns False.
+ */
+bool kshark_import_user_mask(struct kshark_context *kshark_ctx,
+ struct kshark_config_doc *conf)
+{
+ switch (conf->format) {
+ case KS_CONFIG_JSON:
+ return kshark_user_mask_from_json(kshark_ctx,
+ conf->conf_doc);
+
+ default:
+ fprintf(stderr, "Document format %d not supported\n",
+ conf->format);
+ return false;
+ }
+}
+
static bool filter_is_set(struct tracecmd_filter_id *filter)
{
return filter && filter->count;
@@ -1430,6 +1527,7 @@ kshark_export_all_filters(struct kshark_context *kshark_ctx,
!kshark_export_all_event_filters(kshark_ctx, &conf) ||
!kshark_export_all_task_filters(kshark_ctx, &conf) ||
!kshark_export_all_cpu_filters(kshark_ctx, &conf) ||
+ !kshark_export_user_mask(kshark_ctx, &conf) ||
!kshark_export_adv_filters(kshark_ctx, &conf)) {
kshark_free_config_doc(conf);
return NULL;
@@ -1456,6 +1554,7 @@ bool kshark_import_all_filters(struct kshark_context *kshark_ctx,
ret = kshark_import_all_task_filters(kshark_ctx, conf);
ret |= kshark_import_all_cpu_filters(kshark_ctx, conf);
ret |= kshark_import_all_event_filters(kshark_ctx, conf);
+ ret |= kshark_import_user_mask(kshark_ctx, conf);
ret |= kshark_import_adv_filters(kshark_ctx, conf);
return ret;
@@ -504,6 +504,11 @@ enum kshark_config_formats {
*/
#define KS_ADV_EVENT_FILTER_NAME "adv event filter"
+/**
+ * Field name for the Configuration document describing user-specified filter
+ * mask.
+ */
+#define KS_USER_FILTER_MASK_NAME "filter mask"
/**
* Field name for the Configuration document describing the state of the Vis.
* model.
@@ -575,6 +580,12 @@ bool kshark_import_event_filter(struct tep_handle *pevent,
const char *filter_name,
struct kshark_config_doc *conf);
+bool kshark_export_user_mask(struct kshark_context *kshark_ctx,
+ struct kshark_config_doc **conf);
+
+bool kshark_import_user_mask(struct kshark_context *kshark_ctx,
+ struct kshark_config_doc *conf);
+
bool kshark_export_filter_array(struct tracecmd_filter_id *filter,
const char *filter_name,
struct kshark_config_doc *conf);
This patch updates the Json config I/O, making possible to import/export the value of the user filter mask. When the filters are imported, the states of the "Apply filters to Graph" and "Apply filters to List" check-boxes are updated accordingly. Signed-off-by: Yordan Karadzhov <ykaradzhov@vmware.com> --- kernel-shark-qt/src/KsMainWindow.cpp | 35 ++++++--- kernel-shark-qt/src/KsMainWindow.hpp | 6 ++ kernel-shark-qt/src/libkshark-configio.c | 99 ++++++++++++++++++++++++ kernel-shark-qt/src/libkshark.h | 11 +++ 4 files changed, 142 insertions(+), 9 deletions(-)