diff options
author | Havoc Pennington <hp@redhat.com> | 2001-09-21 23:56:43 +0000 |
---|---|---|
committer | Havoc Pennington <hp@src.gnome.org> | 2001-09-21 23:56:43 +0000 |
commit | b7eec02f2ae69ed2a3de51981aabc8a9e2432ef5 (patch) | |
tree | f29626e12026fa766169b6935a24fa780c4f76f9 /gtk/gtktextbtree.c | |
parent | 615b641adaab7f6cd86d077cd9590dd753a075e4 (diff) | |
download | gtk+-b7eec02f2ae69ed2a3de51981aabc8a9e2432ef5.tar.gz |
Bug #60862
2001-09-21 Havoc Pennington <hp@redhat.com>
Bug #60862
* gtk/gtktextbtree.c (gtk_text_btree_node_destroy):
(_gtk_text_btree_unref): fix up mark memory management
* gtk/gtktextmark.c (mark_segment_delete_func): ditto
Diffstat (limited to 'gtk/gtktextbtree.c')
-rw-r--r-- | gtk/gtktextbtree.c | 61 |
1 files changed, 26 insertions, 35 deletions
diff --git a/gtk/gtktextbtree.c b/gtk/gtktextbtree.c index 7d6f51adad..810f3405f8 100644 --- a/gtk/gtktextbtree.c +++ b/gtk/gtktextbtree.c @@ -481,16 +481,6 @@ _gtk_text_btree_ref (GtkTextBTree *tree) tree->refcount += 1; } -static void -mark_destroy_foreach (gpointer key, gpointer value, gpointer user_data) -{ - GtkTextLineSegment *seg = value; - - g_return_if_fail (seg->body.mark.tree == NULL); - - g_object_unref (G_OBJECT (seg->body.mark.obj)); -} - void _gtk_text_btree_unref (GtkTextBTree *tree) { @@ -503,9 +493,7 @@ _gtk_text_btree_unref (GtkTextBTree *tree) { gtk_text_btree_node_destroy (tree, tree->root_node); - g_hash_table_foreach (tree->mark_table, - mark_destroy_foreach, - NULL); + g_assert (g_hash_table_size (tree->mark_table) == 0); g_hash_table_destroy (tree->mark_table); g_object_unref (G_OBJECT (tree->insert_mark)); @@ -757,7 +745,7 @@ _gtk_text_btree_delete (GtkTextIter *start, next = seg->next; char_count = seg->char_count; - if ((*seg->type->deleteFunc)(seg, curline, 0) != 0) + if ((*seg->type->deleteFunc)(seg, curline, FALSE) != 0) { /* * This segment refuses to die. Move it to prev_seg and @@ -2689,8 +2677,25 @@ _gtk_text_btree_remove_mark_by_name (GtkTextBTree *tree, } void +_gtk_text_btree_release_mark_segment (GtkTextBTree *tree, + GtkTextLineSegment *segment) +{ + + if (segment->body.mark.name) + g_hash_table_remove (tree->mark_table, segment->body.mark.name); + + segment->body.mark.tree = NULL; + segment->body.mark.line = NULL; + + /* Remove the ref on the mark, which frees segment as a side effect + * if this is the last reference. + */ + g_object_unref (G_OBJECT (segment->body.mark.obj)); +} + +void _gtk_text_btree_remove_mark (GtkTextBTree *tree, - GtkTextMark *mark) + GtkTextMark *mark) { GtkTextLineSegment *segment; @@ -2707,34 +2712,27 @@ _gtk_text_btree_remove_mark (GtkTextBTree *tree, /* This calls cleanup_line and segments_changed */ gtk_text_btree_unlink_segment (tree, segment, segment->body.mark.line); - - if (segment->body.mark.name) - g_hash_table_remove (tree->mark_table, segment->body.mark.name); - - /* Remove the ref on the mark that belonged to the segment. */ - g_object_unref (G_OBJECT (mark)); - - segment->body.mark.tree = NULL; - segment->body.mark.line = NULL; + + _gtk_text_btree_release_mark_segment (tree, segment); } gboolean _gtk_text_btree_mark_is_insert (GtkTextBTree *tree, - GtkTextMark *segment) + GtkTextMark *segment) { return segment == tree->insert_mark; } gboolean _gtk_text_btree_mark_is_selection_bound (GtkTextBTree *tree, - GtkTextMark *segment) + GtkTextMark *segment) { return segment == tree->selection_bound_mark; } GtkTextMark* _gtk_text_btree_get_mark_by_name (GtkTextBTree *tree, - const gchar *name) + const gchar *name) { GtkTextLineSegment *seg; @@ -5123,14 +5121,7 @@ gtk_text_btree_node_destroy (GtkTextBTree *tree, GtkTextBTreeNode *node) seg = line->segments; line->segments = seg->next; - if (GTK_IS_TEXT_MARK_SEGMENT (seg)) - { - /* Set the mark as deleted */ - seg->body.mark.tree = NULL; - seg->body.mark.line = NULL; - } - - (*seg->type->deleteFunc) (seg, line, 1); + (*seg->type->deleteFunc) (seg, line, TRUE); } gtk_text_line_destroy (tree, line); } |