diff options
Diffstat (limited to 'src/alloc.c')
| -rw-r--r-- | src/alloc.c | 36 |
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 | ||
| 5871 | static Lisp_Object | 5871 | static Lisp_Object |
| 5872 | discard_killed_buffers (Lisp_Object list) | 5872 | mark_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); |