]> Pileus Git - ~andy/gtk/commitdiff
Bug #60862
authorHavoc Pennington <hp@redhat.com>
Fri, 21 Sep 2001 23:56:43 +0000 (23:56 +0000)
committerHavoc Pennington <hp@src.gnome.org>
Fri, 21 Sep 2001 23:56:43 +0000 (23:56 +0000)
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

ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gtk/gtktextbtree.c
gtk/gtktextbtree.h
gtk/gtktextmark.c
gtk/gtktexttagtable.c

index 279288a631c1b79e521e29304080c7ec64f5582f..6d998f0f3a0e50083ad293b681e25d03434df9d6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+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
+
 2001-09-20  Havoc Pennington  <hp@redhat.com>
 
        * gtk/gtktextlayout.c (gtk_text_layout_get_line_display): don't
index 279288a631c1b79e521e29304080c7ec64f5582f..6d998f0f3a0e50083ad293b681e25d03434df9d6 100644 (file)
@@ -1,3 +1,12 @@
+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
+
 2001-09-20  Havoc Pennington  <hp@redhat.com>
 
        * gtk/gtktextlayout.c (gtk_text_layout_get_line_display): don't
index 279288a631c1b79e521e29304080c7ec64f5582f..6d998f0f3a0e50083ad293b681e25d03434df9d6 100644 (file)
@@ -1,3 +1,12 @@
+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
+
 2001-09-20  Havoc Pennington  <hp@redhat.com>
 
        * gtk/gtktextlayout.c (gtk_text_layout_get_line_display): don't
index 279288a631c1b79e521e29304080c7ec64f5582f..6d998f0f3a0e50083ad293b681e25d03434df9d6 100644 (file)
@@ -1,3 +1,12 @@
+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
+
 2001-09-20  Havoc Pennington  <hp@redhat.com>
 
        * gtk/gtktextlayout.c (gtk_text_layout_get_line_display): don't
index 279288a631c1b79e521e29304080c7ec64f5582f..6d998f0f3a0e50083ad293b681e25d03434df9d6 100644 (file)
@@ -1,3 +1,12 @@
+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
+
 2001-09-20  Havoc Pennington  <hp@redhat.com>
 
        * gtk/gtktextlayout.c (gtk_text_layout_get_line_display): don't
index 279288a631c1b79e521e29304080c7ec64f5582f..6d998f0f3a0e50083ad293b681e25d03434df9d6 100644 (file)
@@ -1,3 +1,12 @@
+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
+
 2001-09-20  Havoc Pennington  <hp@redhat.com>
 
        * gtk/gtktextlayout.c (gtk_text_layout_get_line_display): don't
index 279288a631c1b79e521e29304080c7ec64f5582f..6d998f0f3a0e50083ad293b681e25d03434df9d6 100644 (file)
@@ -1,3 +1,12 @@
+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
+
 2001-09-20  Havoc Pennington  <hp@redhat.com>
 
        * gtk/gtktextlayout.c (gtk_text_layout_get_line_display): don't
index 7d6f51adadfe643f82b821472578133219eaf5f9..810f3405f8d239a326ea0d5f3fd4bf7ce8349102 100644 (file)
@@ -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
@@ -2688,9 +2676,26 @@ _gtk_text_btree_remove_mark_by_name (GtkTextBTree *tree,
   _gtk_text_btree_remove_mark (tree, mark);
 }
 
+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);
         }
index 723746d94f504dc68137161ca680e4f64b55c97a..4e3b12236801bd636c839b20504a27ecaa7cd731 100644 (file)
@@ -276,6 +276,9 @@ void _gtk_change_node_toggle_count  (GtkTextBTreeNode   *node,
                                      GtkTextTagInfo     *info,
                                      gint                delta);
 
+/* for gtktextmark.c */
+void _gtk_text_btree_release_mark_segment (GtkTextBTree       *tree,
+                                           GtkTextLineSegment *segment);
 
 #ifdef __cplusplus
 }
index 018eb089b57395c610a3b24ea850c424e5495647..1be324b11a948af2fcd4d4869b2336640dc42d6d 100644 (file)
@@ -113,8 +113,6 @@ gtk_text_mark_finalize (GObject *obj)
 
   if (seg)
     {
-      g_return_if_fail (seg->body.mark.tree == NULL);
-
       if (seg->body.mark.tree != NULL)
         g_warning ("GtkTextMark being finalized while still in the buffer; "
                    "someone removed a reference they didn't own! Crash "
@@ -320,21 +318,27 @@ GtkTextLineSegmentClass gtk_text_left_mark_type = {
  *      a mark lies in a range of characters being deleted.
  *
  * Results:
- *      Returns 1 to indicate that deletion has been rejected.
+ *      Returns 1 to indicate that deletion has been rejected,
+ *      or 0 otherwise
  *
  * Side effects:
- *      None (even if the whole tree is being deleted we don't
- *      free up the mark;  it will be done elsewhere).
+ *      Frees mark if tree is going away
  *
  *--------------------------------------------------------------
  */
 
 static gboolean
-mark_segment_delete_func (GtkTextLineSegment *segPtr,
+mark_segment_delete_func (GtkTextLineSegment *seg,
                           GtkTextLine        *line,
                           gboolean            tree_gone)
 {
-  return TRUE;
+  if (tree_gone)
+    {
+      _gtk_text_btree_release_mark_segment (seg->body.mark.tree, seg);
+      return FALSE;
+    }
+  else
+    return TRUE;
 }
 
 /*
index b20ce3a631794d3ccc1fe30316a7eb9798512277..cb246b26360889aea97e63abdd297a8161b85bf2 100644 (file)
@@ -149,7 +149,7 @@ gtk_text_tag_table_finalize (GObject *object)
   table = GTK_TEXT_TAG_TABLE (object);
 
   gtk_text_tag_table_foreach (table, foreach_unref, NULL);
-
+  
   g_hash_table_destroy (table->hash);
   g_slist_free (table->anonymous);