From 4d2cdb2abec47a06fd22c08b4111915e383c7445 Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Thu, 20 Jul 2023 13:07:51 -0700 Subject: [PATCH] libsysprof: implement category inheretance and remove template type, just keep that with layout. --- src/libsysprof/sysprof-callgraph-categorize.c | 76 +++++++++---------- src/libsysprof/sysprof-callgraph-frame.c | 2 +- src/libsysprof/sysprof-callgraph-private.h | 2 + src/libsysprof/sysprof-callgraph.c | 32 ++++++-- src/libsysprof/sysprof-callgraph.h | 1 - src/sysprof/sysprof-category-icon.c | 3 +- 6 files changed, 64 insertions(+), 52 deletions(-) diff --git a/src/libsysprof/sysprof-callgraph-categorize.c b/src/libsysprof/sysprof-callgraph-categorize.c index 30d5d723..0bae50a4 100644 --- a/src/libsysprof/sysprof-callgraph-categorize.c +++ b/src/libsysprof/sysprof-callgraph-categorize.c @@ -30,10 +30,9 @@ enum { typedef struct _Rule { - guint8 kind : 2; - guint8 inherit : 1; - guint category; - const char *match; + guint8 kind : 2; + SysprofCallgraphCategory category; + const char *match; } Rule; typedef struct _RuleGroup @@ -45,86 +44,79 @@ typedef struct _RuleGroup static RuleGroup rule_groups[] = { { "EGL", (const Rule[]) { - { RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_PAINT, "egl" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_PAINT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "egl" }, { 0 } } }, { "FontConfig", (const Rule[]) { - { RULE_PREFIX, FALSE, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT, "" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "" }, { 0 } } }, { "GLib", (const Rule[]) { - { RULE_PREFIX, FALSE, SYSPROF_CALLGRAPH_CATEGORY_MAIN_LOOP, "g_main_loop_" }, - { RULE_PREFIX, FALSE, SYSPROF_CALLGRAPH_CATEGORY_MAIN_LOOP, "g_main_context_" }, - { RULE_PREFIX, FALSE, SYSPROF_CALLGRAPH_CATEGORY_MAIN_LOOP, "g_wakeup_" }, - { RULE_EXACT, FALSE, SYSPROF_CALLGRAPH_CATEGORY_MAIN_LOOP, "g_main_dispatch" }, - { 0 } - } - }, - - { "GObject", - (const Rule[]) { - { RULE_PREFIX, FALSE, SYSPROF_CALLGRAPH_CATEGORY_SIGNALS, "g_signal_emit" }, - { RULE_PREFIX, FALSE, SYSPROF_CALLGRAPH_CATEGORY_SIGNALS, "g_signal_emit" }, - { RULE_PREFIX, FALSE, SYSPROF_CALLGRAPH_CATEGORY_SIGNALS, "g_object_notify" }, - { RULE_PREFIX, FALSE, SYSPROF_CALLGRAPH_CATEGORY_CONSTRUCTORS, "g_object_new" }, - { RULE_PREFIX, FALSE, SYSPROF_CALLGRAPH_CATEGORY_CONSTRUCTORS, "g_type_create_instance" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_MAIN_LOOP, "g_main_loop_" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_MAIN_LOOP, "g_main_context_" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_MAIN_LOOP|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "g_wakeup_" }, + { RULE_EXACT, SYSPROF_CALLGRAPH_CATEGORY_MAIN_LOOP, "g_main_dispatch" }, { 0 } } }, { "GTK 4", (const Rule[]) { - { RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT, "gtk_css_" }, - { RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT, "gtk_widget_measure" }, - { RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_PAINT, "gdk_snapshot" }, - { RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_PAINT, "gtk_snapshot" }, - { RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT, "gtk_widget_reposition" }, - { RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_WINDOWING, "gtk_window_present" }, - { RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_ACTIONS, "gtk_action_muxer_" }, - { RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_A11Y, "gtk_accessible_" }, - { RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_A11Y, "gtk_at_" }, - { RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_TEMPLATES, "gtk_builder_" }, - { RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_TEMPLATES, "gtk_buildable_" }, - { RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT, "gtk_widget_root" }, - { RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_PAINT, "gdk_frame_clock_paint" }, - { RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT, "_gdk_frame_clock_emit_layout" }, - { RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_PAINT, "_gdk_frame_clock_emit_paint" }, - { RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_PAINT, "_gdk_frame_clock_emit_after_paint" }, - { RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_INPUT, "gdk_surface_handle_event" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gtk_css_" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gtk_widget_measure" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_PAINT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gdk_snapshot" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_PAINT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gtk_snapshot" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gtk_widget_reposition" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_WINDOWING|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gtk_window_present" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_ACTIONS|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gtk_action_muxer_" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_A11Y|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gtk_accessible_" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_A11Y|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gtk_at_" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gtk_builder_" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gtk_buildable_" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gtk_widget_root" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_PAINT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gdk_frame_clock_paint" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "_gdk_frame_clock_emit_layout" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_PAINT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "_gdk_frame_clock_emit_paint" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_PAINT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "_gdk_frame_clock_emit_after_paint" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_INPUT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gdk_surface_handle_event" }, + { RULE_EXACT, SYSPROF_CALLGRAPH_CATEGORY_PAINT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gdk_surface_paint_on_clock" }, + { RULE_EXACT, SYSPROF_CALLGRAPH_CATEGORY_PAINT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gdk_widget_render" }, + { RULE_EXACT, SYSPROF_CALLGRAPH_CATEGORY_PAINT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gdk_widget_real_snapshot" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_PAINT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gsk_gl_" }, { 0 } } }, { "libc", (const Rule[]) { - { RULE_EXACT, TRUE, SYSPROF_CALLGRAPH_CATEGORY_MAIN_LOOP, "poll" }, + { RULE_EXACT, SYSPROF_CALLGRAPH_CATEGORY_MAIN_LOOP|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "poll" }, { 0 } } }, { "Pango", (const Rule[]) { - { RULE_PREFIX, FALSE, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT, "" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "" }, { 0 } } }, { "Wayland Client", (const Rule[]) { - { RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_WINDOWING, "wl_" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_WINDOWING|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "wl_" }, { 0 } } }, { "Wayland Server", (const Rule[]) { - { RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_WINDOWING, "wl_" }, + { RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_WINDOWING|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "wl_" }, { 0 } } }, diff --git a/src/libsysprof/sysprof-callgraph-frame.c b/src/libsysprof/sysprof-callgraph-frame.c index b633a835..3b918874 100644 --- a/src/libsysprof/sysprof-callgraph-frame.c +++ b/src/libsysprof/sysprof-callgraph-frame.c @@ -504,7 +504,7 @@ sysprof_callgraph_frame_get_category (SysprofCallgraphFrame *self) g_return_val_if_fail (SYSPROF_IS_CALLGRAPH_FRAME (self), 0); if (self->callgraph != NULL && self->node != NULL && self->node->category) - return self->node->category; + return self->node->category & ~SYSPROF_CALLGRAPH_CATEGORY_INHERIT; return SYSPROF_CALLGRAPH_CATEGORY_UNCATEGORIZED; } diff --git a/src/libsysprof/sysprof-callgraph-private.h b/src/libsysprof/sysprof-callgraph-private.h index 9d8a57bf..b5c37122 100644 --- a/src/libsysprof/sysprof-callgraph-private.h +++ b/src/libsysprof/sysprof-callgraph-private.h @@ -29,6 +29,8 @@ G_BEGIN_DECLS +#define SYSPROF_CALLGRAPH_CATEGORY_INHERIT (1<<30) + typedef struct _SysprofCallgraphSummary { SysprofSymbol *symbol; diff --git a/src/libsysprof/sysprof-callgraph.c b/src/libsysprof/sysprof-callgraph.c index bf37c306..a352e8a3 100644 --- a/src/libsysprof/sysprof-callgraph.c +++ b/src/libsysprof/sysprof-callgraph.c @@ -316,16 +316,36 @@ sysprof_callgraph_categorize (SysprofCallgraph *self, case SYSPROF_SYMBOL_KIND_USER: node->category = _sysprof_callgraph_node_categorize (node); + if (node->category > SYSPROF_CALLGRAPH_CATEGORY_UNCATEGORIZED) + break; + G_GNUC_FALLTHROUGH; default: - if (node->parent) - node->category = node->parent->category; - else - node->category = SYSPROF_CALLGRAPH_CATEGORY_UNCATEGORIZED; - break; - } + { + SysprofCallgraphNode *parent = node->parent; + while (parent != NULL) + { + /* If we reach an uncategorized, then nothing above + * is doing inheritance. + */ + if (parent->category == SYSPROF_CALLGRAPH_CATEGORY_UNCATEGORIZED) + break; + + if (parent->category & SYSPROF_CALLGRAPH_CATEGORY_INHERIT) + { + node->category = parent->category; + return; + } + + parent = parent->parent; + } + + node->category = SYSPROF_CALLGRAPH_CATEGORY_UNCATEGORIZED; + break; + } + } } static void diff --git a/src/libsysprof/sysprof-callgraph.h b/src/libsysprof/sysprof-callgraph.h index 537a0b1c..00a9fee5 100644 --- a/src/libsysprof/sysprof-callgraph.h +++ b/src/libsysprof/sysprof-callgraph.h @@ -76,7 +76,6 @@ typedef enum _SysprofCallgraphCategory SYSPROF_CALLGRAPH_CATEGORY_PAINT, SYSPROF_CALLGRAPH_CATEGORY_PRESENTATION, SYSPROF_CALLGRAPH_CATEGORY_SIGNALS, - SYSPROF_CALLGRAPH_CATEGORY_TEMPLATES, SYSPROF_CALLGRAPH_CATEGORY_UNWINDABLE, SYSPROF_CALLGRAPH_CATEGORY_WINDOWING, diff --git a/src/sysprof/sysprof-category-icon.c b/src/sysprof/sysprof-category-icon.c index e6550ce1..8d7bb0d3 100644 --- a/src/sysprof/sysprof-category-icon.c +++ b/src/sysprof/sysprof-category-icon.c @@ -25,7 +25,7 @@ struct _SysprofCategoryIcon { GtkWidget parent_instance; - guint category; + SysprofCallgraphCategory category; }; enum { @@ -129,7 +129,6 @@ sysprof_category_icon_class_init (SysprofCategoryIconClass *klass) gdk_rgba_parse (&category_colors[SYSPROF_CALLGRAPH_CATEGORY_MAIN_LOOP], "#5e5c64"); gdk_rgba_parse (&category_colors[SYSPROF_CALLGRAPH_CATEGORY_PAINT], "#2ec27e"); gdk_rgba_parse (&category_colors[SYSPROF_CALLGRAPH_CATEGORY_SIGNALS], "#e5a50a"); - gdk_rgba_parse (&category_colors[SYSPROF_CALLGRAPH_CATEGORY_TEMPLATES], "#77767b"); gdk_rgba_parse (&category_colors[SYSPROF_CALLGRAPH_CATEGORY_WINDOWING], "#c64600"); }