mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2026-02-10 07:00:53 +00:00
libsysprof: implement category inheretance
and remove template type, just keep that with layout.
This commit is contained in:
@ -30,10 +30,9 @@ enum {
|
|||||||
|
|
||||||
typedef struct _Rule
|
typedef struct _Rule
|
||||||
{
|
{
|
||||||
guint8 kind : 2;
|
guint8 kind : 2;
|
||||||
guint8 inherit : 1;
|
SysprofCallgraphCategory category;
|
||||||
guint category;
|
const char *match;
|
||||||
const char *match;
|
|
||||||
} Rule;
|
} Rule;
|
||||||
|
|
||||||
typedef struct _RuleGroup
|
typedef struct _RuleGroup
|
||||||
@ -45,86 +44,79 @@ typedef struct _RuleGroup
|
|||||||
static RuleGroup rule_groups[] = {
|
static RuleGroup rule_groups[] = {
|
||||||
{ "EGL",
|
{ "EGL",
|
||||||
(const Rule[]) {
|
(const Rule[]) {
|
||||||
{ RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_PAINT, "egl" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_PAINT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "egl" },
|
||||||
{ 0 }
|
{ 0 }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
{ "FontConfig",
|
{ "FontConfig",
|
||||||
(const Rule[]) {
|
(const Rule[]) {
|
||||||
{ RULE_PREFIX, FALSE, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT, "" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "" },
|
||||||
{ 0 }
|
{ 0 }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
{ "GLib",
|
{ "GLib",
|
||||||
(const Rule[]) {
|
(const Rule[]) {
|
||||||
{ RULE_PREFIX, FALSE, SYSPROF_CALLGRAPH_CATEGORY_MAIN_LOOP, "g_main_loop_" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_MAIN_LOOP, "g_main_loop_" },
|
||||||
{ RULE_PREFIX, FALSE, SYSPROF_CALLGRAPH_CATEGORY_MAIN_LOOP, "g_main_context_" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_MAIN_LOOP, "g_main_context_" },
|
||||||
{ RULE_PREFIX, FALSE, SYSPROF_CALLGRAPH_CATEGORY_MAIN_LOOP, "g_wakeup_" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_MAIN_LOOP|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "g_wakeup_" },
|
||||||
{ RULE_EXACT, FALSE, SYSPROF_CALLGRAPH_CATEGORY_MAIN_LOOP, "g_main_dispatch" },
|
{ RULE_EXACT, 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" },
|
|
||||||
{ 0 }
|
{ 0 }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
{ "GTK 4",
|
{ "GTK 4",
|
||||||
(const Rule[]) {
|
(const Rule[]) {
|
||||||
{ RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT, "gtk_css_" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gtk_css_" },
|
||||||
{ RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT, "gtk_widget_measure" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gtk_widget_measure" },
|
||||||
{ RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_PAINT, "gdk_snapshot" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_PAINT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gdk_snapshot" },
|
||||||
{ RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_PAINT, "gtk_snapshot" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_PAINT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gtk_snapshot" },
|
||||||
{ RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT, "gtk_widget_reposition" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gtk_widget_reposition" },
|
||||||
{ RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_WINDOWING, "gtk_window_present" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_WINDOWING|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gtk_window_present" },
|
||||||
{ RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_ACTIONS, "gtk_action_muxer_" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_ACTIONS|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gtk_action_muxer_" },
|
||||||
{ RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_A11Y, "gtk_accessible_" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_A11Y|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gtk_accessible_" },
|
||||||
{ RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_A11Y, "gtk_at_" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_A11Y|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gtk_at_" },
|
||||||
{ RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_TEMPLATES, "gtk_builder_" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gtk_builder_" },
|
||||||
{ RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_TEMPLATES, "gtk_buildable_" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gtk_buildable_" },
|
||||||
{ RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT, "gtk_widget_root" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gtk_widget_root" },
|
||||||
{ RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_PAINT, "gdk_frame_clock_paint" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_PAINT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "gdk_frame_clock_paint" },
|
||||||
{ RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT, "_gdk_frame_clock_emit_layout" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "_gdk_frame_clock_emit_layout" },
|
||||||
{ RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_PAINT, "_gdk_frame_clock_emit_paint" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_PAINT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "_gdk_frame_clock_emit_paint" },
|
||||||
{ RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_PAINT, "_gdk_frame_clock_emit_after_paint" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_PAINT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "_gdk_frame_clock_emit_after_paint" },
|
||||||
{ RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_INPUT, "gdk_surface_handle_event" },
|
{ 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 }
|
{ 0 }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
{ "libc",
|
{ "libc",
|
||||||
(const Rule[]) {
|
(const Rule[]) {
|
||||||
{ RULE_EXACT, TRUE, SYSPROF_CALLGRAPH_CATEGORY_MAIN_LOOP, "poll" },
|
{ RULE_EXACT, SYSPROF_CALLGRAPH_CATEGORY_MAIN_LOOP|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "poll" },
|
||||||
{ 0 }
|
{ 0 }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
{ "Pango",
|
{ "Pango",
|
||||||
(const Rule[]) {
|
(const Rule[]) {
|
||||||
{ RULE_PREFIX, FALSE, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT, "" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_LAYOUT|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "" },
|
||||||
{ 0 }
|
{ 0 }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
{ "Wayland Client",
|
{ "Wayland Client",
|
||||||
(const Rule[]) {
|
(const Rule[]) {
|
||||||
{ RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_WINDOWING, "wl_" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_WINDOWING|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "wl_" },
|
||||||
{ 0 }
|
{ 0 }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
{ "Wayland Server",
|
{ "Wayland Server",
|
||||||
(const Rule[]) {
|
(const Rule[]) {
|
||||||
{ RULE_PREFIX, TRUE, SYSPROF_CALLGRAPH_CATEGORY_WINDOWING, "wl_" },
|
{ RULE_PREFIX, SYSPROF_CALLGRAPH_CATEGORY_WINDOWING|SYSPROF_CALLGRAPH_CATEGORY_INHERIT, "wl_" },
|
||||||
{ 0 }
|
{ 0 }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@ -504,7 +504,7 @@ sysprof_callgraph_frame_get_category (SysprofCallgraphFrame *self)
|
|||||||
g_return_val_if_fail (SYSPROF_IS_CALLGRAPH_FRAME (self), 0);
|
g_return_val_if_fail (SYSPROF_IS_CALLGRAPH_FRAME (self), 0);
|
||||||
|
|
||||||
if (self->callgraph != NULL && self->node != NULL && self->node->category)
|
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;
|
return SYSPROF_CALLGRAPH_CATEGORY_UNCATEGORIZED;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,6 +29,8 @@
|
|||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
#define SYSPROF_CALLGRAPH_CATEGORY_INHERIT (1<<30)
|
||||||
|
|
||||||
typedef struct _SysprofCallgraphSummary
|
typedef struct _SysprofCallgraphSummary
|
||||||
{
|
{
|
||||||
SysprofSymbol *symbol;
|
SysprofSymbol *symbol;
|
||||||
|
|||||||
@ -316,16 +316,36 @@ sysprof_callgraph_categorize (SysprofCallgraph *self,
|
|||||||
case SYSPROF_SYMBOL_KIND_USER:
|
case SYSPROF_SYMBOL_KIND_USER:
|
||||||
node->category = _sysprof_callgraph_node_categorize (node);
|
node->category = _sysprof_callgraph_node_categorize (node);
|
||||||
|
|
||||||
|
if (node->category > SYSPROF_CALLGRAPH_CATEGORY_UNCATEGORIZED)
|
||||||
|
break;
|
||||||
|
|
||||||
G_GNUC_FALLTHROUGH;
|
G_GNUC_FALLTHROUGH;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (node->parent)
|
{
|
||||||
node->category = node->parent->category;
|
SysprofCallgraphNode *parent = node->parent;
|
||||||
else
|
|
||||||
node->category = SYSPROF_CALLGRAPH_CATEGORY_UNCATEGORIZED;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
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
|
static void
|
||||||
|
|||||||
@ -76,7 +76,6 @@ typedef enum _SysprofCallgraphCategory
|
|||||||
SYSPROF_CALLGRAPH_CATEGORY_PAINT,
|
SYSPROF_CALLGRAPH_CATEGORY_PAINT,
|
||||||
SYSPROF_CALLGRAPH_CATEGORY_PRESENTATION,
|
SYSPROF_CALLGRAPH_CATEGORY_PRESENTATION,
|
||||||
SYSPROF_CALLGRAPH_CATEGORY_SIGNALS,
|
SYSPROF_CALLGRAPH_CATEGORY_SIGNALS,
|
||||||
SYSPROF_CALLGRAPH_CATEGORY_TEMPLATES,
|
|
||||||
SYSPROF_CALLGRAPH_CATEGORY_UNWINDABLE,
|
SYSPROF_CALLGRAPH_CATEGORY_UNWINDABLE,
|
||||||
SYSPROF_CALLGRAPH_CATEGORY_WINDOWING,
|
SYSPROF_CALLGRAPH_CATEGORY_WINDOWING,
|
||||||
|
|
||||||
|
|||||||
@ -25,7 +25,7 @@
|
|||||||
struct _SysprofCategoryIcon
|
struct _SysprofCategoryIcon
|
||||||
{
|
{
|
||||||
GtkWidget parent_instance;
|
GtkWidget parent_instance;
|
||||||
guint category;
|
SysprofCallgraphCategory category;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
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_MAIN_LOOP], "#5e5c64");
|
||||||
gdk_rgba_parse (&category_colors[SYSPROF_CALLGRAPH_CATEGORY_PAINT], "#2ec27e");
|
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_SIGNALS], "#e5a50a");
|
||||||
gdk_rgba_parse (&category_colors[SYSPROF_CALLGRAPH_CATEGORY_TEMPLATES], "#77767b");
|
|
||||||
gdk_rgba_parse (&category_colors[SYSPROF_CALLGRAPH_CATEGORY_WINDOWING], "#c64600");
|
gdk_rgba_parse (&category_colors[SYSPROF_CALLGRAPH_CATEGORY_WINDOWING], "#c64600");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user