mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2026-02-12 16:10:54 +00:00
libsysprof-analyze: make mark catalog work with sections
This allows us more flexibility with creating sections usin the flatten list model as the rows need to contain the data for the headers.
This commit is contained in:
@ -1456,11 +1456,13 @@ sysprof_document_list_symbols_in_traceable (SysprofDocument *self,
|
|||||||
* sysprof_document_catalog_marks:
|
* sysprof_document_catalog_marks:
|
||||||
* @self: a #SysprofDocument
|
* @self: a #SysprofDocument
|
||||||
*
|
*
|
||||||
* Generates a catalog of marks which can be used to sort marks by
|
* Get's a #GListModel of #GListModel of #SysprofMarkCatalog.
|
||||||
* group, then another catalog by name, which is then itself a #GListModel
|
|
||||||
* of #SysprofDocumentMark.
|
|
||||||
*
|
*
|
||||||
* Returns: (transfer full): a #GListModel of #SysprofMarkCatalog
|
* You can use this to display sections in #GtkListView and similar
|
||||||
|
* using #GtkFlattenListModel.
|
||||||
|
*
|
||||||
|
* Returns: (transfer full): a #GListModel of #GListModel of
|
||||||
|
* #SysprofMarkCatalog grouped by mark group.
|
||||||
*/
|
*/
|
||||||
GListModel *
|
GListModel *
|
||||||
sysprof_document_catalog_marks (SysprofDocument *self)
|
sysprof_document_catalog_marks (SysprofDocument *self)
|
||||||
@ -1471,34 +1473,31 @@ sysprof_document_catalog_marks (SysprofDocument *self)
|
|||||||
|
|
||||||
g_return_val_if_fail (SYSPROF_IS_DOCUMENT (self), NULL);
|
g_return_val_if_fail (SYSPROF_IS_DOCUMENT (self), NULL);
|
||||||
|
|
||||||
store = g_list_store_new (SYSPROF_TYPE_MARK_CATALOG);
|
store = g_list_store_new (G_TYPE_LIST_MODEL);
|
||||||
|
|
||||||
g_hash_table_iter_init (&iter, self->mark_groups);
|
g_hash_table_iter_init (&iter, self->mark_groups);
|
||||||
|
|
||||||
while (g_hash_table_iter_next (&iter, &key, &value))
|
while (g_hash_table_iter_next (&iter, &key, &value))
|
||||||
{
|
{
|
||||||
g_autoptr(SysprofMarkCatalog) group = NULL;
|
g_autoptr(GListStore) group = NULL;
|
||||||
g_autoptr(GListStore) names_store = NULL;
|
|
||||||
const char *group_name = key;
|
const char *group_name = key;
|
||||||
GHashTable *names = value;
|
GHashTable *names = value;
|
||||||
GHashTableIter name_iter;
|
GHashTableIter name_iter;
|
||||||
const char *name;
|
const char *name;
|
||||||
EggBitset *marks;
|
EggBitset *marks;
|
||||||
|
|
||||||
names_store = g_list_store_new (SYSPROF_TYPE_MARK_CATALOG);
|
group = g_list_store_new (SYSPROF_TYPE_MARK_CATALOG);
|
||||||
|
|
||||||
g_hash_table_iter_init (&name_iter, names);
|
g_hash_table_iter_init (&name_iter, names);
|
||||||
|
|
||||||
while (g_hash_table_iter_next (&name_iter, (gpointer *)&name, (gpointer *)&marks))
|
while (g_hash_table_iter_next (&name_iter, (gpointer *)&name, (gpointer *)&marks))
|
||||||
{
|
{
|
||||||
g_autoptr(GListModel) model = _sysprof_document_bitset_index_new (G_LIST_MODEL (self), marks);
|
g_autoptr(GListModel) model = _sysprof_document_bitset_index_new (G_LIST_MODEL (self), marks);
|
||||||
g_autoptr(SysprofMarkCatalog) names_catalog = _sysprof_mark_catalog_new (name, model, SYSPROF_MARK_CATALOG_KIND_NAME);
|
g_autoptr(SysprofMarkCatalog) names_catalog = _sysprof_mark_catalog_new (group_name, name, model);
|
||||||
|
|
||||||
g_list_store_append (names_store, names_catalog);
|
g_list_store_append (group, names_catalog);
|
||||||
}
|
}
|
||||||
|
|
||||||
group = _sysprof_mark_catalog_new (group_name, G_LIST_MODEL (names_store), SYSPROF_MARK_CATALOG_KIND_GROUP);
|
|
||||||
|
|
||||||
g_list_store_append (store, group);
|
g_list_store_append (store, group);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -26,8 +26,8 @@
|
|||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
SysprofMarkCatalog *_sysprof_mark_catalog_new (const char *name,
|
SysprofMarkCatalog *_sysprof_mark_catalog_new (const char *group,
|
||||||
GListModel *items,
|
const char *name,
|
||||||
SysprofMarkCatalogKind kind);
|
GListModel *items);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|||||||
@ -26,14 +26,14 @@ struct _SysprofMarkCatalog
|
|||||||
{
|
{
|
||||||
GObject parent_instance;
|
GObject parent_instance;
|
||||||
GListModel *items;
|
GListModel *items;
|
||||||
|
char *group;
|
||||||
char *name;
|
char *name;
|
||||||
SysprofMarkCatalogKind kind : 1;
|
|
||||||
} SysprofMarkCatalogPrivate;
|
} SysprofMarkCatalogPrivate;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
PROP_0,
|
PROP_0,
|
||||||
|
PROP_GROUP,
|
||||||
PROP_NAME,
|
PROP_NAME,
|
||||||
PROP_KIND,
|
|
||||||
N_PROPS
|
N_PROPS
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -74,6 +74,7 @@ sysprof_mark_catalog_dispose (GObject *object)
|
|||||||
{
|
{
|
||||||
SysprofMarkCatalog *self = (SysprofMarkCatalog *)object;
|
SysprofMarkCatalog *self = (SysprofMarkCatalog *)object;
|
||||||
|
|
||||||
|
g_clear_pointer (&self->group, g_free);
|
||||||
g_clear_pointer (&self->name, g_free);
|
g_clear_pointer (&self->name, g_free);
|
||||||
g_clear_object (&self->items);
|
g_clear_object (&self->items);
|
||||||
|
|
||||||
@ -90,8 +91,8 @@ sysprof_mark_catalog_get_property (GObject *object,
|
|||||||
|
|
||||||
switch (prop_id)
|
switch (prop_id)
|
||||||
{
|
{
|
||||||
case PROP_KIND:
|
case PROP_GROUP:
|
||||||
g_value_set_enum (value, sysprof_mark_catalog_get_kind (self));
|
g_value_set_string (value, sysprof_mark_catalog_get_group (self));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_NAME:
|
case PROP_NAME:
|
||||||
@ -111,11 +112,10 @@ sysprof_mark_catalog_class_init (SysprofMarkCatalogClass *klass)
|
|||||||
object_class->dispose = sysprof_mark_catalog_dispose;
|
object_class->dispose = sysprof_mark_catalog_dispose;
|
||||||
object_class->get_property = sysprof_mark_catalog_get_property;
|
object_class->get_property = sysprof_mark_catalog_get_property;
|
||||||
|
|
||||||
properties[PROP_KIND] =
|
properties[PROP_GROUP] =
|
||||||
g_param_spec_enum ("kind", NULL, NULL,
|
g_param_spec_string ("group", NULL, NULL,
|
||||||
SYSPROF_TYPE_MARK_CATALOG_KIND,
|
NULL,
|
||||||
SYSPROF_MARK_CATALOG_KIND_GROUP,
|
(G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
||||||
(G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
||||||
|
|
||||||
properties[PROP_NAME] =
|
properties[PROP_NAME] =
|
||||||
g_param_spec_string ("name", NULL, NULL,
|
g_param_spec_string ("name", NULL, NULL,
|
||||||
@ -130,6 +130,14 @@ sysprof_mark_catalog_init (SysprofMarkCatalog *self)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
sysprof_mark_catalog_get_group (SysprofMarkCatalog *self)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (SYSPROF_IS_MARK_CATALOG (self), NULL);
|
||||||
|
|
||||||
|
return self->group;
|
||||||
|
}
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
sysprof_mark_catalog_get_name (SysprofMarkCatalog *self)
|
sysprof_mark_catalog_get_name (SysprofMarkCatalog *self)
|
||||||
{
|
{
|
||||||
@ -139,9 +147,9 @@ sysprof_mark_catalog_get_name (SysprofMarkCatalog *self)
|
|||||||
}
|
}
|
||||||
|
|
||||||
SysprofMarkCatalog *
|
SysprofMarkCatalog *
|
||||||
_sysprof_mark_catalog_new (const char *name,
|
_sysprof_mark_catalog_new (const char *group,
|
||||||
GListModel *items,
|
const char *name,
|
||||||
SysprofMarkCatalogKind kind)
|
GListModel *items)
|
||||||
{
|
{
|
||||||
SysprofMarkCatalog *self;
|
SysprofMarkCatalog *self;
|
||||||
|
|
||||||
@ -149,21 +157,9 @@ _sysprof_mark_catalog_new (const char *name,
|
|||||||
g_return_val_if_fail (G_IS_LIST_MODEL (items), NULL);
|
g_return_val_if_fail (G_IS_LIST_MODEL (items), NULL);
|
||||||
|
|
||||||
self = g_object_new (SYSPROF_TYPE_MARK_CATALOG, NULL);
|
self = g_object_new (SYSPROF_TYPE_MARK_CATALOG, NULL);
|
||||||
|
self->group = g_strdup (group);
|
||||||
self->name = g_strdup (name);
|
self->name = g_strdup (name);
|
||||||
self->items = g_object_ref (items);
|
self->items = g_object_ref (items);
|
||||||
self->kind = kind;
|
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
SysprofMarkCatalogKind
|
|
||||||
sysprof_mark_catalog_get_kind (SysprofMarkCatalog *self)
|
|
||||||
{
|
|
||||||
g_return_val_if_fail (SYSPROF_IS_MARK_CATALOG (self), 0);
|
|
||||||
|
|
||||||
return self->kind;
|
|
||||||
}
|
|
||||||
|
|
||||||
G_DEFINE_ENUM_TYPE (SysprofMarkCatalogKind, sysprof_mark_catalog_kind,
|
|
||||||
G_DEFINE_ENUM_VALUE (SYSPROF_MARK_CATALOG_KIND_GROUP, "group"),
|
|
||||||
G_DEFINE_ENUM_VALUE (SYSPROF_MARK_CATALOG_KIND_NAME, "name"))
|
|
||||||
|
|||||||
@ -27,22 +27,13 @@
|
|||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
#define SYSPROF_TYPE_MARK_CATALOG (sysprof_mark_catalog_get_type())
|
#define SYSPROF_TYPE_MARK_CATALOG (sysprof_mark_catalog_get_type())
|
||||||
#define SYSPROF_TYPE_MARK_CATALOG_KIND (sysprof_mark_catalog_kind_get_type())
|
|
||||||
|
|
||||||
typedef enum _SysprofMarkCatalogKind
|
|
||||||
{
|
|
||||||
SYSPROF_MARK_CATALOG_KIND_GROUP,
|
|
||||||
SYSPROF_MARK_CATALOG_KIND_NAME,
|
|
||||||
} SysprofMarkCatalogKind;
|
|
||||||
|
|
||||||
SYSPROF_AVAILABLE_IN_ALL
|
SYSPROF_AVAILABLE_IN_ALL
|
||||||
G_DECLARE_FINAL_TYPE (SysprofMarkCatalog, sysprof_mark_catalog, SYSPROF, MARK_CATALOG, GObject)
|
G_DECLARE_FINAL_TYPE (SysprofMarkCatalog, sysprof_mark_catalog, SYSPROF, MARK_CATALOG, GObject)
|
||||||
|
|
||||||
SYSPROF_AVAILABLE_IN_ALL
|
SYSPROF_AVAILABLE_IN_ALL
|
||||||
GType sysprof_mark_catalog_kind_get_type (void) G_GNUC_CONST;
|
const char *sysprof_mark_catalog_get_group (SysprofMarkCatalog *self);
|
||||||
SYSPROF_AVAILABLE_IN_ALL
|
SYSPROF_AVAILABLE_IN_ALL
|
||||||
const char *sysprof_mark_catalog_get_name (SysprofMarkCatalog *self);
|
const char *sysprof_mark_catalog_get_name (SysprofMarkCatalog *self);
|
||||||
SYSPROF_AVAILABLE_IN_ALL
|
|
||||||
SysprofMarkCatalogKind sysprof_mark_catalog_get_kind (SysprofMarkCatalog *self);
|
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|||||||
@ -28,7 +28,7 @@ main (int argc,
|
|||||||
{
|
{
|
||||||
g_autoptr(SysprofDocumentLoader) loader = NULL;
|
g_autoptr(SysprofDocumentLoader) loader = NULL;
|
||||||
g_autoptr(SysprofDocument) document = NULL;
|
g_autoptr(SysprofDocument) document = NULL;
|
||||||
g_autoptr(GListModel) marks = NULL;
|
g_autoptr(GListModel) groups = NULL;
|
||||||
g_autoptr(GError) error = NULL;
|
g_autoptr(GError) error = NULL;
|
||||||
guint n_groups;
|
guint n_groups;
|
||||||
|
|
||||||
@ -47,46 +47,24 @@ main (int argc,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
marks = sysprof_document_catalog_marks (document);
|
groups = sysprof_document_catalog_marks (document);
|
||||||
n_groups = g_list_model_get_n_items (marks);
|
n_groups = g_list_model_get_n_items (groups);
|
||||||
|
|
||||||
for (guint i = 0; i < n_groups; i++)
|
for (guint i = 0; i < n_groups; i++)
|
||||||
{
|
{
|
||||||
g_autoptr(SysprofMarkCatalog) catalog = g_list_model_get_item (marks, i);
|
g_autoptr(GListModel) catalogs = g_list_model_get_item (groups, i);
|
||||||
const char *group = sysprof_mark_catalog_get_name (catalog);
|
guint n_catalogs = g_list_model_get_n_items (catalogs);
|
||||||
guint n_names = g_list_model_get_n_items (G_LIST_MODEL (catalog));
|
|
||||||
|
|
||||||
g_assert (SYSPROF_IS_MARK_CATALOG (catalog));
|
for (guint j = 0; j < n_catalogs; j++)
|
||||||
g_assert (G_IS_LIST_MODEL (catalog));
|
|
||||||
g_assert (sysprof_mark_catalog_get_kind (catalog) == SYSPROF_MARK_CATALOG_KIND_GROUP);
|
|
||||||
|
|
||||||
g_print ("%s\n", group);
|
|
||||||
|
|
||||||
for (guint j = 0; j < n_names; j++)
|
|
||||||
{
|
{
|
||||||
g_autoptr(SysprofMarkCatalog) name_catalog = g_list_model_get_item (G_LIST_MODEL (catalog), j);
|
g_autoptr(SysprofMarkCatalog) catalog = g_list_model_get_item (catalogs, j);
|
||||||
const char *name = sysprof_mark_catalog_get_name (name_catalog);
|
const char *group = sysprof_mark_catalog_get_group (catalog);
|
||||||
guint n_marks = g_list_model_get_n_items (G_LIST_MODEL (name_catalog));
|
const char *name = sysprof_mark_catalog_get_name (catalog);
|
||||||
|
|
||||||
g_assert (SYSPROF_IS_MARK_CATALOG (name_catalog));
|
if (j == 0)
|
||||||
g_assert (G_IS_LIST_MODEL (name_catalog));
|
g_print ("%s\n", group);
|
||||||
g_assert (sysprof_mark_catalog_get_kind (name_catalog) == SYSPROF_MARK_CATALOG_KIND_NAME);
|
|
||||||
|
|
||||||
g_print (" %s\n", name);
|
g_print (" %s\n", name);
|
||||||
|
|
||||||
for (guint k = 0; k < n_marks; k++)
|
|
||||||
{
|
|
||||||
g_autoptr(SysprofDocumentMark) mark = g_list_model_get_item (G_LIST_MODEL (name_catalog), k);
|
|
||||||
const char *message = sysprof_document_mark_get_message (mark);
|
|
||||||
|
|
||||||
g_assert (SYSPROF_IS_DOCUMENT_MARK (mark));
|
|
||||||
|
|
||||||
g_assert_cmpstr (sysprof_document_mark_get_group (mark), ==, group);
|
|
||||||
g_assert_cmpstr (sysprof_document_mark_get_name (mark), ==, name);
|
|
||||||
|
|
||||||
if (message && message[0])
|
|
||||||
g_print (" %s\n", message);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -66,3 +66,7 @@ callgraphview row:not(:selected) treeexpander symbol.unwindable {
|
|||||||
marktable {
|
marktable {
|
||||||
font-size: .9em;
|
font-size: .9em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
markchart {
|
||||||
|
font-size: .9em;
|
||||||
|
}
|
||||||
|
|||||||
@ -45,17 +45,6 @@ G_DEFINE_FINAL_TYPE (SysprofMarkChart, sysprof_mark_chart, GTK_TYPE_WIDGET)
|
|||||||
|
|
||||||
static GParamSpec *properties [N_PROPS];
|
static GParamSpec *properties [N_PROPS];
|
||||||
|
|
||||||
static GListModel *
|
|
||||||
create_model_func (gpointer item,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
if (SYSPROF_IS_MARK_CATALOG (item) &&
|
|
||||||
sysprof_mark_catalog_get_kind (item) == SYSPROF_MARK_CATALOG_KIND_GROUP)
|
|
||||||
return g_object_ref (item);
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
sysprof_mark_chart_disconnect (SysprofMarkChart *self)
|
sysprof_mark_chart_disconnect (SysprofMarkChart *self)
|
||||||
{
|
{
|
||||||
@ -70,7 +59,7 @@ sysprof_mark_chart_connect (SysprofMarkChart *self)
|
|||||||
{
|
{
|
||||||
g_autoptr(GtkSingleSelection) single = NULL;
|
g_autoptr(GtkSingleSelection) single = NULL;
|
||||||
GtkFilterListModel *filtered;
|
GtkFilterListModel *filtered;
|
||||||
GtkTreeListModel *marks_tree;
|
GtkFlattenListModel *flatten;
|
||||||
SysprofDocument *document;
|
SysprofDocument *document;
|
||||||
GtkSortListModel *sort_model;
|
GtkSortListModel *sort_model;
|
||||||
GtkSorter *column_sorter;
|
GtkSorter *column_sorter;
|
||||||
@ -81,11 +70,8 @@ sysprof_mark_chart_connect (SysprofMarkChart *self)
|
|||||||
column_sorter = gtk_column_view_get_sorter (self->column_view);
|
column_sorter = gtk_column_view_get_sorter (self->column_view);
|
||||||
|
|
||||||
document = sysprof_session_get_document (self->session);
|
document = sysprof_session_get_document (self->session);
|
||||||
marks_tree = gtk_tree_list_model_new (sysprof_document_catalog_marks (document),
|
flatten = gtk_flatten_list_model_new (sysprof_document_catalog_marks (document));
|
||||||
FALSE, TRUE,
|
filtered = gtk_filter_list_model_new (G_LIST_MODEL (flatten), NULL);
|
||||||
create_model_func,
|
|
||||||
NULL, NULL);
|
|
||||||
filtered = gtk_filter_list_model_new (G_LIST_MODEL (marks_tree), NULL);
|
|
||||||
g_object_bind_property (self->session, "filter", filtered, "filter", G_BINDING_SYNC_CREATE);
|
g_object_bind_property (self->session, "filter", filtered, "filter", G_BINDING_SYNC_CREATE);
|
||||||
sort_model = gtk_sort_list_model_new (G_LIST_MODEL (filtered), g_object_ref (column_sorter));
|
sort_model = gtk_sort_list_model_new (G_LIST_MODEL (filtered), g_object_ref (column_sorter));
|
||||||
single = gtk_single_selection_new (G_LIST_MODEL (sort_model));
|
single = gtk_single_selection_new (G_LIST_MODEL (sort_model));
|
||||||
|
|||||||
@ -19,13 +19,14 @@
|
|||||||
<interface>
|
<interface>
|
||||||
<template class="GtkListHeader">
|
<template class="GtkListHeader">
|
||||||
<property name="child">
|
<property name="child">
|
||||||
<object class="GtkLabel">
|
<object class="GtkInscription">
|
||||||
<property name="xalign">0</property>
|
<property name="xalign">0</property>
|
||||||
<binding name="label">
|
<property name="nat-chars">40</property>
|
||||||
<lookup name="name" type="SysprofMarkCatalog">
|
<property name="min-chars">40</property>
|
||||||
<lookup name="item" type="GtkTreeListRow">
|
<property name="text-overflow">clip</property>
|
||||||
<lookup name="item">GtkListHeader</lookup>
|
<binding name="text">
|
||||||
</lookup>
|
<lookup name="group" type="SysprofMarkCatalog">
|
||||||
|
<lookup name="item">GtkListHeader</lookup>
|
||||||
</lookup>
|
</lookup>
|
||||||
</binding>
|
</binding>
|
||||||
</object>
|
</object>
|
||||||
@ -38,6 +39,7 @@
|
|||||||
</property>
|
</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkColumnViewColumn" id="name_column">
|
<object class="GtkColumnViewColumn" id="name_column">
|
||||||
|
<property name="title" translatable="yes">Marks</property>
|
||||||
<property name="factory">
|
<property name="factory">
|
||||||
<object class="GtkBuilderListItemFactory">
|
<object class="GtkBuilderListItemFactory">
|
||||||
<property name="bytes"><![CDATA[
|
<property name="bytes"><![CDATA[
|
||||||
@ -51,9 +53,7 @@
|
|||||||
<property name="max-width-chars">40</property>
|
<property name="max-width-chars">40</property>
|
||||||
<binding name="label">
|
<binding name="label">
|
||||||
<lookup name="name" type="SysprofMarkCatalog">
|
<lookup name="name" type="SysprofMarkCatalog">
|
||||||
<lookup name="item" type="GtkTreeListRow">
|
<lookup name="item">GtkListItem</lookup>
|
||||||
<lookup name="item">GtkListItem</lookup>
|
|
||||||
</lookup>
|
|
||||||
</lookup>
|
</lookup>
|
||||||
</binding>
|
</binding>
|
||||||
</object>
|
</object>
|
||||||
|
|||||||
Reference in New Issue
Block a user