diff options
| author | Dmitry Antipov | 2012-07-03 07:57:52 +0400 |
|---|---|---|
| committer | Dmitry Antipov | 2012-07-03 07:57:52 +0400 |
| commit | 36429c89cbd7282a7614a358e5edb4d37f4a3f47 (patch) | |
| tree | eafca213d91a33d626e60caec38ccc21bdd394fe /src/alloc.c | |
| parent | b544fef2ac730e5fc8c072b33584d9b48d25f6fa (diff) | |
| download | emacs-36429c89cbd7282a7614a358e5edb4d37f4a3f47.tar.gz emacs-36429c89cbd7282a7614a358e5edb4d37f4a3f47.zip | |
Cleanup basic buffer management.
* buffer.h (struct buffer): Change layout to use generic vector
marking code. Fix some comments. Change type of 'clip_changed'
to bitfield. Remove unused #ifndef old.
(FIRST_FIELD_PER_BUFFER, LAST_FIELD_PER_BUFFER): Remove.
(GET_OVERLAYS_AT): Fix indentation.
(for_each_per_buffer_object_at): New macro.
* buffer.c (clone_per_buffer_values, reset_buffer_local_variables)
(Fbuffer_local_variables): Use it.
(init_buffer_once, syms_of_buffer): Remove unused #ifndef old.
* alloc.c (allocate_buffer): Adjust to match new layout of
struct buffer. Fix comment.
(mark_overlay): New function.
(mark_buffer): Use it. Use mark_vectorlike to mark normal
Lisp area of struct buffer.
(mark_object): Use it. Adjust marking of misc objects
and related comments.
Diffstat (limited to 'src/alloc.c')
| -rw-r--r-- | src/alloc.c | 131 |
1 files changed, 54 insertions, 77 deletions
diff --git a/src/alloc.c b/src/alloc.c index b0945aa30de..b329f89d15b 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -1186,21 +1186,6 @@ lisp_align_free (void *block) | |||
| 1186 | MALLOC_UNBLOCK_INPUT; | 1186 | MALLOC_UNBLOCK_INPUT; |
| 1187 | } | 1187 | } |
| 1188 | 1188 | ||
| 1189 | /* Return a new buffer structure allocated from the heap with | ||
| 1190 | a call to lisp_malloc. */ | ||
| 1191 | |||
| 1192 | struct buffer * | ||
| 1193 | allocate_buffer (void) | ||
| 1194 | { | ||
| 1195 | struct buffer *b | ||
| 1196 | = (struct buffer *) lisp_malloc (sizeof (struct buffer), | ||
| 1197 | MEM_TYPE_BUFFER); | ||
| 1198 | XSETPVECTYPESIZE (b, PVEC_BUFFER, | ||
| 1199 | ((sizeof (struct buffer) + sizeof (EMACS_INT) - 1) | ||
| 1200 | / sizeof (EMACS_INT))); | ||
| 1201 | return b; | ||
| 1202 | } | ||
| 1203 | |||
| 1204 | 1189 | ||
| 1205 | #ifndef SYSTEM_MALLOC | 1190 | #ifndef SYSTEM_MALLOC |
| 1206 | 1191 | ||
| @@ -3258,6 +3243,17 @@ allocate_pseudovector (int memlen, int lisplen, int tag) | |||
| 3258 | return v; | 3243 | return v; |
| 3259 | } | 3244 | } |
| 3260 | 3245 | ||
| 3246 | struct buffer * | ||
| 3247 | allocate_buffer (void) | ||
| 3248 | { | ||
| 3249 | struct buffer *b = lisp_malloc (sizeof (struct buffer), MEM_TYPE_BUFFER); | ||
| 3250 | |||
| 3251 | XSETPVECTYPESIZE (b, PVEC_BUFFER, (offsetof (struct buffer, own_text) | ||
| 3252 | - header_size) / word_size); | ||
| 3253 | /* Note that the fields of B are not initialized. */ | ||
| 3254 | return b; | ||
| 3255 | } | ||
| 3256 | |||
| 3261 | struct Lisp_Hash_Table * | 3257 | struct Lisp_Hash_Table * |
| 3262 | allocate_hash_table (void) | 3258 | allocate_hash_table (void) |
| 3263 | { | 3259 | { |
| @@ -5786,15 +5782,29 @@ mark_char_table (struct Lisp_Vector *ptr) | |||
| 5786 | } | 5782 | } |
| 5787 | } | 5783 | } |
| 5788 | 5784 | ||
| 5789 | /* Mark the pointers in a buffer structure. */ | 5785 | /* Mark the chain of overlays starting at PTR. */ |
| 5786 | |||
| 5787 | static void | ||
| 5788 | mark_overlay (struct Lisp_Overlay *ptr) | ||
| 5789 | { | ||
| 5790 | for (; ptr && !ptr->gcmarkbit; ptr = ptr->next) | ||
| 5791 | { | ||
| 5792 | ptr->gcmarkbit = 1; | ||
| 5793 | mark_object (ptr->start); | ||
| 5794 | mark_object (ptr->end); | ||
| 5795 | mark_object (ptr->plist); | ||
| 5796 | } | ||
| 5797 | } | ||
| 5798 | |||
| 5799 | /* Mark Lisp_Objects and special pointers in BUFFER. */ | ||
| 5790 | 5800 | ||
| 5791 | static void | 5801 | static void |
| 5792 | mark_buffer (struct buffer *buffer) | 5802 | mark_buffer (struct buffer *buffer) |
| 5793 | { | 5803 | { |
| 5794 | register Lisp_Object *ptr, tmp; | 5804 | /* This is handled much like other pseudovectors... */ |
| 5805 | mark_vectorlike ((struct Lisp_Vector *) buffer); | ||
| 5795 | 5806 | ||
| 5796 | eassert (!VECTOR_MARKED_P (buffer)); | 5807 | /* ...but there are some buffer-specific things. */ |
| 5797 | VECTOR_MARK (buffer); | ||
| 5798 | 5808 | ||
| 5799 | MARK_INTERVAL_TREE (BUF_INTERVALS (buffer)); | 5809 | MARK_INTERVAL_TREE (BUF_INTERVALS (buffer)); |
| 5800 | 5810 | ||
| @@ -5802,24 +5812,8 @@ mark_buffer (struct buffer *buffer) | |||
| 5802 | a special way just before the sweep phase, and after stripping | 5812 | a special way just before the sweep phase, and after stripping |
| 5803 | some of its elements that are not needed any more. */ | 5813 | some of its elements that are not needed any more. */ |
| 5804 | 5814 | ||
| 5805 | if (buffer->overlays_before) | 5815 | mark_overlay (buffer->overlays_before); |
| 5806 | { | 5816 | mark_overlay (buffer->overlays_after); |
| 5807 | XSETMISC (tmp, buffer->overlays_before); | ||
| 5808 | mark_object (tmp); | ||
| 5809 | } | ||
| 5810 | if (buffer->overlays_after) | ||
| 5811 | { | ||
| 5812 | XSETMISC (tmp, buffer->overlays_after); | ||
| 5813 | mark_object (tmp); | ||
| 5814 | } | ||
| 5815 | |||
| 5816 | /* buffer-local Lisp variables start at `undo_list', | ||
| 5817 | tho only the ones from `name' on are GC'd normally. */ | ||
| 5818 | for (ptr = &buffer->BUFFER_INTERNAL_FIELD (name); | ||
| 5819 | ptr <= &PER_BUFFER_VALUE (buffer, | ||
| 5820 | PER_BUFFER_VAR_OFFSET (LAST_FIELD_PER_BUFFER)); | ||
| 5821 | ptr++) | ||
| 5822 | mark_object (*ptr); | ||
| 5823 | 5817 | ||
| 5824 | /* If this is an indirect buffer, mark its base buffer. */ | 5818 | /* If this is an indirect buffer, mark its base buffer. */ |
| 5825 | if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer)) | 5819 | if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer)) |
| @@ -6061,52 +6055,35 @@ mark_object (Lisp_Object arg) | |||
| 6061 | 6055 | ||
| 6062 | case Lisp_Misc: | 6056 | case Lisp_Misc: |
| 6063 | CHECK_ALLOCATED_AND_LIVE (live_misc_p); | 6057 | CHECK_ALLOCATED_AND_LIVE (live_misc_p); |
| 6064 | if (XMISCANY (obj)->gcmarkbit) | ||
| 6065 | break; | ||
| 6066 | XMISCANY (obj)->gcmarkbit = 1; | ||
| 6067 | 6058 | ||
| 6068 | switch (XMISCTYPE (obj)) | 6059 | if (XMISCTYPE (obj) == Lisp_Misc_Overlay) |
| 6060 | mark_overlay (XOVERLAY (obj)); | ||
| 6061 | else | ||
| 6069 | { | 6062 | { |
| 6063 | if (XMISCANY (obj)->gcmarkbit) | ||
| 6064 | break; | ||
| 6065 | XMISCANY (obj)->gcmarkbit = 1; | ||
| 6070 | 6066 | ||
| 6071 | case Lisp_Misc_Marker: | 6067 | /* Note that we don't mark thru the marker's |
| 6072 | /* DO NOT mark thru the marker's chain. | 6068 | chain. The buffer's markers chain does not |
| 6073 | The buffer's markers chain does not preserve markers from gc; | 6069 | preserve markers from GC; instead, markers |
| 6074 | instead, markers are removed from the chain when freed by gc. */ | 6070 | are removed from the chain when freed by GC. */ |
| 6075 | break; | ||
| 6076 | 6071 | ||
| 6077 | case Lisp_Misc_Save_Value: | ||
| 6078 | #if GC_MARK_STACK | 6072 | #if GC_MARK_STACK |
| 6079 | { | 6073 | if (XMISCTYPE (obj) == Lisp_Misc_Save_Value) |
| 6080 | register struct Lisp_Save_Value *ptr = XSAVE_VALUE (obj); | 6074 | { |
| 6081 | /* If DOGC is set, POINTER is the address of a memory | 6075 | register struct Lisp_Save_Value *ptr = XSAVE_VALUE (obj); |
| 6082 | area containing INTEGER potential Lisp_Objects. */ | 6076 | /* If DOGC is set, POINTER is the address of a memory |
| 6083 | if (ptr->dogc) | 6077 | area containing INTEGER potential Lisp_Objects. */ |
| 6084 | { | 6078 | if (ptr->dogc) |
| 6085 | Lisp_Object *p = (Lisp_Object *) ptr->pointer; | 6079 | { |
| 6086 | ptrdiff_t nelt; | 6080 | Lisp_Object *p = (Lisp_Object *) ptr->pointer; |
| 6087 | for (nelt = ptr->integer; nelt > 0; nelt--, p++) | 6081 | ptrdiff_t nelt; |
| 6088 | mark_maybe_object (*p); | 6082 | for (nelt = ptr->integer; nelt > 0; nelt--, p++) |
| 6089 | } | 6083 | mark_maybe_object (*p); |
| 6090 | } | 6084 | } |
| 6085 | } | ||
| 6091 | #endif | 6086 | #endif |
| 6092 | break; | ||
| 6093 | |||
| 6094 | case Lisp_Misc_Overlay: | ||
| 6095 | { | ||
| 6096 | struct Lisp_Overlay *ptr = XOVERLAY (obj); | ||
| 6097 | mark_object (ptr->start); | ||
| 6098 | mark_object (ptr->end); | ||
| 6099 | mark_object (ptr->plist); | ||
| 6100 | if (ptr->next) | ||
| 6101 | { | ||
| 6102 | XSETMISC (obj, ptr->next); | ||
| 6103 | goto loop; | ||
| 6104 | } | ||
| 6105 | } | ||
| 6106 | break; | ||
| 6107 | |||
| 6108 | default: | ||
| 6109 | abort (); | ||
| 6110 | } | 6087 | } |
| 6111 | break; | 6088 | break; |
| 6112 | 6089 | ||