aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/alloc.c')
-rw-r--r--src/alloc.c36
1 files changed, 15 insertions, 21 deletions
diff --git a/src/alloc.c b/src/alloc.c
index 61cb7086c25..77807f6e086 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -5865,16 +5865,16 @@ mark_buffer (struct buffer *buffer)
5865 mark_buffer (buffer->base_buffer); 5865 mark_buffer (buffer->base_buffer);
5866} 5866}
5867 5867
5868/* Remove killed buffers or items whose car is a killed buffer 5868/* Remove killed buffers or items whose car is a killed buffer from
5869 from LIST and return changed LIST. Called during GC. */ 5869 LIST, and mark other items. Return changed LIST, which is marked. */
5870 5870
5871static Lisp_Object 5871static Lisp_Object
5872discard_killed_buffers (Lisp_Object list) 5872mark_discard_killed_buffers (Lisp_Object list)
5873{ 5873{
5874 Lisp_Object *prev = &list; 5874 Lisp_Object tail, *prev = &list;
5875 Lisp_Object tail;
5876 5875
5877 for (tail = list; CONSP (tail); tail = XCDR (tail)) 5876 for (tail = list; CONSP (tail) && !CONS_MARKED_P (XCONS (tail));
5877 tail = XCDR (tail))
5878 { 5878 {
5879 Lisp_Object tem = XCAR (tail); 5879 Lisp_Object tem = XCAR (tail);
5880 if (CONSP (tem)) 5880 if (CONSP (tem))
@@ -5882,7 +5882,11 @@ discard_killed_buffers (Lisp_Object list)
5882 if (BUFFERP (tem) && !BUFFER_LIVE_P (XBUFFER (tem))) 5882 if (BUFFERP (tem) && !BUFFER_LIVE_P (XBUFFER (tem)))
5883 *prev = XCDR (tail); 5883 *prev = XCDR (tail);
5884 else 5884 else
5885 prev = &XCDR_AS_LVALUE (tail); 5885 {
5886 CONS_MARK (XCONS (tail));
5887 mark_object (XCAR (tail));
5888 prev = &XCDR_AS_LVALUE (tail);
5889 }
5886 } 5890 }
5887 return list; 5891 return list;
5888} 5892}
@@ -6023,18 +6027,8 @@ mark_object (Lisp_Object arg)
6023 break; 6027 break;
6024 6028
6025 case PVEC_FRAME: 6029 case PVEC_FRAME:
6026 { 6030 mark_vectorlike (ptr);
6027 struct frame *f = (struct frame *) ptr; 6031 mark_face_cache (((struct frame *) ptr)->face_cache);
6028
6029 /* For live frames, killed buffers are filtered out by
6030 store_frame_param. For dead frames, we do it here in
6031 attempt to help GC to reclaim killed buffers faster. */
6032 if (!FRAME_LIVE_P (f))
6033 fset_buffer_list (f, discard_killed_buffers (f->buffer_list));
6034
6035 mark_vectorlike (ptr);
6036 mark_face_cache (f->face_cache);
6037 }
6038 break; 6032 break;
6039 6033
6040 case PVEC_WINDOW: 6034 case PVEC_WINDOW:
@@ -6048,9 +6042,9 @@ mark_object (Lisp_Object arg)
6048 if (leaf && NILP (w->buffer)) 6042 if (leaf && NILP (w->buffer))
6049 { 6043 {
6050 wset_prev_buffers 6044 wset_prev_buffers
6051 (w, discard_killed_buffers (w->prev_buffers)); 6045 (w, mark_discard_killed_buffers (w->prev_buffers));
6052 wset_next_buffers 6046 wset_next_buffers
6053 (w, discard_killed_buffers (w->next_buffers)); 6047 (w, mark_discard_killed_buffers (w->next_buffers));
6054 } 6048 }
6055 6049
6056 mark_vectorlike (ptr); 6050 mark_vectorlike (ptr);