diff --git a/src/libsysprof/sysprof-callgraph-frame.c b/src/libsysprof/sysprof-callgraph-frame.c index 655187e6..2ec8a918 100644 --- a/src/libsysprof/sysprof-callgraph-frame.c +++ b/src/libsysprof/sysprof-callgraph-frame.c @@ -24,7 +24,7 @@ #include "sysprof-callgraph-private.h" #include "sysprof-callgraph-frame-private.h" -#include "sysprof-category-summary.h" +#include "sysprof-category-summary-private.h" #include "sysprof-enums.h" #include "sysprof-symbol-private.h" #include "sysprof-document-bitset-index-private.h" @@ -510,13 +510,17 @@ sysprof_callgraph_frame_get_category (SysprofCallgraphFrame *self) return SYSPROF_CALLGRAPH_CATEGORY_UNCATEGORIZED; } +typedef struct _Summary +{ + guint64 count; +} Summary; + static void summarize_node (const SysprofCallgraphNode *node, - GListStore *store, - GHashTable *category_to_summary) + Summary *summaries) { for (const SysprofCallgraphNode *iter = node->children; iter; iter = iter->next) - summarize_node (iter, store, category_to_summary); + summarize_node (iter, summaries); } static void @@ -526,17 +530,36 @@ sysprof_callgraph_frame_summarize (GTask *task, GCancellable *cancellable) { SysprofCallgraphFrame *self = source_object; - g_autoptr(GHashTable) category_to_summary = NULL; + g_autofree Summary *summaries = NULL; g_autoptr(GListStore) store = NULL; + guint64 total = 0; g_assert (G_IS_TASK (task)); g_assert (SYSPROF_IS_CALLGRAPH_FRAME (self)); g_assert (SYSPROF_IS_CALLGRAPH (task_data)); - store = g_list_store_new (G_TYPE_OBJECT); - category_to_summary = g_hash_table_new (NULL, NULL); + summaries = g_new0 (Summary, SYSPROF_CALLGRAPH_CATEGORY_LAST); + summarize_node (self->node, summaries); - summarize_node (self->node, store, category_to_summary); + store = g_list_store_new (G_TYPE_OBJECT); + + for (guint i = 0; i < SYSPROF_CALLGRAPH_CATEGORY_LAST; i++) + total += summaries[i].count; + + for (guint i = 0; i < SYSPROF_CALLGRAPH_CATEGORY_LAST; i++) + { + g_autoptr(SysprofCategorySummary) summary = NULL; + + if (summaries[i].count == 0) + continue; + + summary = g_object_new (SYSPROF_TYPE_CATEGORY_SUMMARY, NULL); + summary->category = i; + summary->total = total; + summary->count = summaries[i].count; + + g_list_store_append (store, summary); + } g_task_return_pointer (task, g_steal_pointer (&store), g_object_unref); } diff --git a/src/libsysprof/sysprof-category-summary-private.h b/src/libsysprof/sysprof-category-summary-private.h new file mode 100644 index 00000000..5516bcc0 --- /dev/null +++ b/src/libsysprof/sysprof-category-summary-private.h @@ -0,0 +1,35 @@ +/* sysprof-category-summary-private.h + * + * Copyright 2023 Christian Hergert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#pragma once + +#include "sysprof-category-summary.h" + +G_BEGIN_DECLS + +struct _SysprofCategorySummary +{ + GObject parent_instance; + SysprofCallgraphCategory category; + guint64 count; + guint64 total; +}; + +G_END_DECLS diff --git a/src/libsysprof/sysprof-category-summary.c b/src/libsysprof/sysprof-category-summary.c index df2d7c47..ea1288c8 100644 --- a/src/libsysprof/sysprof-category-summary.c +++ b/src/libsysprof/sysprof-category-summary.c @@ -20,17 +20,9 @@ #include "config.h" -#include "sysprof-category-summary.h" +#include "sysprof-category-summary-private.h" #include "sysprof-enums.h" -struct _SysprofCategorySummary -{ - GObject parent_instance; - SysprofCallgraphCategory category; - guint64 count; - guint64 total; -}; - enum { PROP_0, PROP_CATEGORY,