diff --git a/ChangeLog b/ChangeLog index 89db255a..7ee6a80d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2006-11-22 Soren Sandmann + + * profile.c (add_trace_to_tree): Move match to front + (add_trace_to_tree): Break as soon as a recursive call is found. + + * stackstash.c (do_callback): Manual tail call optimization. + 2006-11-20 Soren Sandmann * sysprof.c (ensure_profile): reset the collector after generating diff --git a/collector.c b/collector.c index 90635844..817eb376 100644 --- a/collector.c +++ b/collector.c @@ -156,9 +156,9 @@ on_read (gpointer data) #if 0 { int i; - g_print ("pid: %d (%d)\n", trace.pid, trace.n_addresses); - for (i=0; i < trace.n_addresses; ++i) - g_print ("rd: %08x\n", trace.addresses[i]); + g_print ("pid: %d (%d)\n", trace->pid, trace->n_addresses); + for (i=0; i < trace->n_addresses; ++i) + g_print ("rd: %08x\n", trace->addresses[i]); g_print ("-=-\n"); } #endif diff --git a/profile.c b/profile.c index 4c810caf..f4eb5fa7 100644 --- a/profile.c +++ b/profile.c @@ -256,20 +256,30 @@ add_trace_to_tree (GList *trace, gint size, gpointer data) GList *list; ProfileDescendant *parent = NULL; int i, len; - ProfileDescendant **tree = data; - + ProfileDescendant **tree = data; + if (!nodes_to_unmark) nodes_to_unmark = g_ptr_array_new (); - + for (list = g_list_last (trace); list != NULL; list = list->prev) { gpointer address = list->data; ProfileDescendant *match = NULL; + ProfileDescendant *prev = NULL; - for (match = *tree; match != NULL; match = match->siblings) + for (match = *tree; match != NULL; prev = match, match = match->siblings) { if (match->name == address) + { + if (prev) + { + /* Move to front */ + prev->siblings = match->siblings; + match->siblings = *tree; + *tree = match; + } break; + } } if (!match) @@ -282,7 +292,10 @@ add_trace_to_tree (GList *trace, gint size, gpointer data) for (n = parent; n != NULL; n = n->parent) { if (n->name == address) + { seen_tree_node = n; + break; + } } if (seen_tree_node) diff --git a/stackstash.c b/stackstash.c index 1844946b..928e637b 100644 --- a/stackstash.c +++ b/stackstash.c @@ -204,21 +204,26 @@ do_callback (StackNode *node, { GList link; - if (!node) - return; - if (trace) trace->prev = &link; - + link.next = trace; - link.data = node->address; link.prev = NULL; - - if (node->size) - func (&link, node->size, data); - do_callback (node->children, &link, func, data); - do_callback (node->siblings, trace, func, data); + while (node) + { + link.data = node->address; + + if (node->size) + func (&link, node->size, data); + + do_callback (node->children, &link, func, data); + + node = node->siblings; + } + + if (trace) + trace->prev = NULL; } void