From c0aed2a4de1ae9bd8de9702c8d89bc3cf653641e Mon Sep 17 00:00:00 2001 From: Soeren Sandmann Date: Sat, 5 Nov 2005 22:57:09 +0000 Subject: [PATCH] Use callbacks from stackstash. Sat Nov 5 18:06:40 2005 Soeren Sandmann * profile.c (profile_create_descendants): Use callbacks from stackstash. * stackstash.c (stack_node_foreach_trace): New function * stackstash.c (do_node_callback): New function --- ChangeLog | 8 ++++++++ profile.c | 39 ++++++++++----------------------------- stackstash.c | 36 ++++++++++++++++++++++++++++++++++++ stackstash.h | 5 +++++ 4 files changed, 59 insertions(+), 29 deletions(-) diff --git a/ChangeLog b/ChangeLog index c51a6a4..fe18595 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Sat Nov 5 18:06:40 2005 Soeren Sandmann + + * profile.c (profile_create_descendants): Use callbacks from + stackstash. + + * stackstash.c (stack_node_foreach_trace): New function + * stackstash.c (do_node_callback): New function + Sat Nov 5 12:39:33 2005 Soeren Sandmann * profile.c (add_trace_to_tree): Don't compute the total field. diff --git a/profile.c b/profile.c index 81ed2b8..af58187 100644 --- a/profile.c +++ b/profile.c @@ -243,18 +243,22 @@ profile_new (StackStash *stash) } static void -add_trace_to_tree (ProfileDescendant **tree, GList *trace, guint size) +add_trace_to_tree (GSList *trace, gpointer data) { - GList *list; + GSList *list; GPtrArray *nodes_to_unmark = g_ptr_array_new (); ProfileDescendant *parent = NULL; int i, len; - + ProfileDescendant **tree = data; + guint size = ((StackNode *)trace->data)->size; + + trace = g_slist_reverse (g_slist_copy (trace)); + for (list = trace; list != NULL; list = list->next) { StackNode *node = list->data; ProfileDescendant *match = NULL; - + update(); for (match = *tree; match != NULL; match = match->siblings) @@ -329,20 +333,7 @@ add_trace_to_tree (ProfileDescendant **tree, GList *trace, guint size) } g_ptr_array_free (nodes_to_unmark, TRUE); -} - -static void -add_leaf_to_tree (ProfileDescendant **tree, StackNode *leaf, StackNode *top) -{ - GList *trace = NULL; - StackNode *node; - - for (node = leaf; node != top->parent; node = node->parent) - trace = g_list_prepend (trace, node); - - add_trace_to_tree (tree, trace, leaf->size); - - g_list_free (trace); + g_slist_free (trace); } ProfileDescendant * @@ -356,17 +347,7 @@ profile_create_descendants (Profile *profile, while (node) { if (node->toplevel) - { - GList *leaves = NULL; - GList *list; - - stack_node_list_leaves (node, &leaves); - - for (list = leaves; list != NULL; list = list->next) - add_leaf_to_tree (&tree, list->data, node); - - g_list_free (leaves); - } + stack_node_foreach_trace (node, add_trace_to_tree, &tree); node = node->next; } diff --git a/stackstash.c b/stackstash.c index 7975760..af82f50 100644 --- a/stackstash.c +++ b/stackstash.c @@ -156,6 +156,42 @@ stack_stash_foreach (StackStash *stash, } static void +do_node_callback (StackNode *node, const GSList *trace, + StackTraceFunction func, + gpointer data) +{ + GSList link; + + if (!node) + return; + + link.next = (GSList *)trace; + link.data = node; + + if (node->size) + func (&link, data); + + do_node_callback (node->children, &link, func, data); + do_node_callback (node->siblings, trace, func, data); +} + +void +stack_node_foreach_trace (StackNode *node, + StackTraceFunction func, + gpointer data) +{ + GSList link; + + link.next = NULL; + link.data = node; + + if (node->size) + func (&link, data); + + do_node_callback (node->children, &link, func, data); +} + +static void stack_node_free (StackNode *node) { if (!node) diff --git a/stackstash.h b/stackstash.h index a75b339..1a5ce6c 100644 --- a/stackstash.h +++ b/stackstash.h @@ -59,6 +59,11 @@ StackNode *stack_stash_find_node (StackStash *stash, /* FIXME: should probably return a list */ void stack_node_list_leaves (StackNode *node, GList **leaves); +typedef void (* StackTraceFunction) (GSList *trace, gpointer data); +void stack_node_foreach_trace (StackNode *node, + StackTraceFunction func, + gpointer data); + typedef void (* StackNodeFunc) (StackNode *node, gpointer data); void stack_stash_foreach_by_address (StackStash *stash, -- 2.7.4