emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] /srv/bzr/emacs/trunk r110008: Function to mark objects and


From: Dmitry Antipov
Subject: [Emacs-diffs] /srv/bzr/emacs/trunk r110008: Function to mark objects and remove killed buffers at once.
Date: Thu, 13 Sep 2012 09:18:26 +0400
User-agent: Bazaar (2.5.0)

------------------------------------------------------------
revno: 110008
committer: Dmitry Antipov <address@hidden>
branch nick: trunk
timestamp: Thu 2012-09-13 09:18:26 +0400
message:
  Function to mark objects and remove killed buffers at once.
  * alloc.c (discard_killed_buffers): Rename to ...
  (mark_discard_killed buffers) ... new name.  Add marking
  of remaining objects.  Fix comment.  Adjust users.
  (mark_object): Do not touch frame buffer lists here.
  * frame.c (delete_frame): Reset frame buffer lists here.
modified:
  src/ChangeLog
  src/alloc.c
  src/frame.c
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2012-09-13 04:14:33 +0000
+++ b/src/ChangeLog     2012-09-13 05:18:26 +0000
@@ -1,3 +1,12 @@
+2012-09-13  Dmitry Antipov  <address@hidden>
+
+       Function to mark objects and remove killed buffers at once.
+       * alloc.c (discard_killed_buffers): Rename to ...
+       (mark_discard_killed buffers) ... new name.  Add marking
+       of remaining objects.  Fix comment.  Adjust users.
+       (mark_object): Do not touch frame buffer lists here.
+       * frame.c (delete_frame): Reset frame buffer lists here.
+
 2012-09-13  Paul Eggert  <address@hidden>
 
        Better workaround for GNOME bug when --enable-gcc-warnings.

=== modified file 'src/alloc.c'
--- a/src/alloc.c       2012-09-11 20:35:23 +0000
+++ b/src/alloc.c       2012-09-13 05:18:26 +0000
@@ -5865,16 +5865,16 @@
     mark_buffer (buffer->base_buffer);
 }
 
-/* Remove killed buffers or items whose car is a killed buffer
-   from LIST and return changed LIST.  Called during GC.  */
+/* Remove killed buffers or items whose car is a killed buffer from
+   LIST, and mark other items. Return changed LIST, which is marked.  */
 
 static Lisp_Object
-discard_killed_buffers (Lisp_Object list)
+mark_discard_killed_buffers (Lisp_Object list)
 {
-  Lisp_Object *prev = &list;
-  Lisp_Object tail;
+  Lisp_Object tail, *prev = &list;
 
-  for (tail = list; CONSP (tail); tail = XCDR (tail))
+  for (tail = list; CONSP (tail) && !CONS_MARKED_P (XCONS (tail));
+       tail = XCDR (tail))
     {
       Lisp_Object tem = XCAR (tail);
       if (CONSP (tem))
@@ -5882,7 +5882,11 @@
       if (BUFFERP (tem) && !BUFFER_LIVE_P (XBUFFER (tem)))
        *prev = XCDR (tail);
       else
-       prev = &XCDR_AS_LVALUE (tail);
+       {
+         CONS_MARK (XCONS (tail));
+         mark_object (XCAR (tail));
+         prev = &XCDR_AS_LVALUE (tail);
+       }
     }
   return list;
 }
@@ -6023,18 +6027,8 @@
            break;
 
          case PVEC_FRAME:
-           {
-             struct frame *f = (struct frame *) ptr;
-
-             /* For live frames, killed buffers are filtered out by
-                store_frame_param.  For dead frames, we do it here in
-                attempt to help GC to reclaim killed buffers faster.  */
-             if (!FRAME_LIVE_P (f))
-               fset_buffer_list (f, discard_killed_buffers (f->buffer_list));
-
-             mark_vectorlike (ptr);
-             mark_face_cache (f->face_cache);
-           }
+           mark_vectorlike (ptr);
+           mark_face_cache (((struct frame *) ptr)->face_cache);
            break;
 
          case PVEC_WINDOW:
@@ -6048,9 +6042,9 @@
              if (leaf && NILP (w->buffer))
                {
                  wset_prev_buffers
-                   (w, discard_killed_buffers (w->prev_buffers));
+                   (w, mark_discard_killed_buffers (w->prev_buffers));
                  wset_next_buffers
-                   (w, discard_killed_buffers (w->next_buffers));
+                   (w, mark_discard_killed_buffers (w->next_buffers));
                }
 
              mark_vectorlike (ptr);

=== modified file 'src/frame.c'
--- a/src/frame.c       2012-09-04 17:34:54 +0000
+++ b/src/frame.c       2012-09-13 05:18:26 +0000
@@ -1299,6 +1299,11 @@
      structures can still refer to it.  */
   fset_menu_bar_vector (f, Qnil);
 
+  /* If FRAME's buffer lists contains killed
+     buffers, this helps GC to reclaim them.  */
+  fset_buffer_list (f, Qnil);
+  fset_buried_buffer_list (f, Qnil);
+
   free_font_driver_list (f);
   xfree (f->namebuf);
   xfree (f->decode_mode_spec_buffer);


reply via email to

[Prev in Thread] Current Thread [Next in Thread]