diff options
author | Soren Sandmann <sandmann@redhat.com> | 2006-03-12 04:00:23 +0000 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@src.gnome.org> | 2006-03-12 04:00:23 +0000 |
commit | 9859854cc18cd67876b2f1280a02556cedfc6cc4 (patch) | |
tree | 60ecf40d6b15322525052d7b09df2a5f852e8a75 /stackstash.c | |
parent | 849efc820deef78c2ee35947713f007902411f81 (diff) |
updates
2006-03-11 Soren Sandmann <sandmann@redhat.com>
* TODO: updates
* stackstash.[ch]: Make stackstash refcounted
* collector.c, profile.c: Update for refcounted stackstash, plug
leak.
* collector.c (open_fd): Remove FIXME comment
Diffstat (limited to 'stackstash.c')
-rw-r--r-- | stackstash.c | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/stackstash.c b/stackstash.c index cee0d2b..d22c69f 100644 --- a/stackstash.c +++ b/stackstash.c @@ -23,6 +23,7 @@ struct StackStash { StackNode *root; GHashTable *nodes_by_data; + int ref_count; }; static StackNode * @@ -39,18 +40,25 @@ stack_node_new (void) return node; } -/* Stach */ -StackStash * -stack_stash_new (void) +static StackStash * +create_stack_stash (void) { StackStash *stash = g_new (StackStash, 1); stash->root = NULL; stash->nodes_by_data = g_hash_table_new (g_direct_hash, g_direct_equal); + stash->ref_count = 1; return stash; } +/* Stach */ +StackStash * +stack_stash_new (void) +{ + return create_stack_stash(); +} + void decorate_node (StackStash *stash, StackNode *node) @@ -187,8 +195,8 @@ stack_node_free (StackNode *node) g_free (node); } -void -stack_stash_free (StackStash *stash) +static void +stack_stash_free (StackStash *stash) { stack_node_free (stash->root); g_hash_table_destroy (stash->nodes_by_data); @@ -196,6 +204,21 @@ stack_stash_free (StackStash *stash) g_free (stash); } +void +stack_stash_unref (StackStash *stash) +{ + stash->ref_count--; + if (stash->ref_count == 0) + stack_stash_free (stash); +} + +StackStash * +stack_stash_ref (StackStash *stash) +{ + stash->ref_count++; + return stash; +} + StackNode * stack_stash_find_node (StackStash *stash, gpointer data) @@ -256,10 +279,7 @@ build_hash_table (StackNode *node, StackStash * stack_stash_new_from_root (StackNode *root) { - StackStash *stash = g_new (StackStash, 1); - - stash->root = root; - stash->nodes_by_data = g_hash_table_new (g_direct_hash, g_direct_equal); + StackStash *stash = create_stack_stash(); build_hash_table (stash->root, stash); |