diff options
Diffstat (limited to 'src/alloc.c')
| -rw-r--r-- | src/alloc.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/src/alloc.c b/src/alloc.c index 29351952860..63447d078f9 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -845,7 +845,7 @@ lisp_align_free (block) | |||
| 845 | free_ablock = ablock; | 845 | free_ablock = ablock; |
| 846 | /* Update busy count. */ | 846 | /* Update busy count. */ |
| 847 | ABLOCKS_BUSY (abase) = (struct ablocks *) (-2 + (long) ABLOCKS_BUSY (abase)); | 847 | ABLOCKS_BUSY (abase) = (struct ablocks *) (-2 + (long) ABLOCKS_BUSY (abase)); |
| 848 | 848 | ||
| 849 | if (2 > (long) ABLOCKS_BUSY (abase)) | 849 | if (2 > (long) ABLOCKS_BUSY (abase)) |
| 850 | { /* All the blocks are free. */ | 850 | { /* All the blocks are free. */ |
| 851 | int i = 0, aligned = (long) ABLOCKS_BUSY (abase); | 851 | int i = 0, aligned = (long) ABLOCKS_BUSY (abase); |
| @@ -4467,6 +4467,17 @@ returns nil, because real GC can't be done. */) | |||
| 4467 | mark_kboards (); | 4467 | mark_kboards (); |
| 4468 | mark_ttys (); | 4468 | mark_ttys (); |
| 4469 | 4469 | ||
| 4470 | #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES | ||
| 4471 | mark_stack (); | ||
| 4472 | #endif | ||
| 4473 | |||
| 4474 | #ifdef USE_GTK | ||
| 4475 | { | ||
| 4476 | extern void xg_mark_data (); | ||
| 4477 | xg_mark_data (); | ||
| 4478 | } | ||
| 4479 | #endif | ||
| 4480 | |||
| 4470 | /* Look thru every buffer's undo list | 4481 | /* Look thru every buffer's undo list |
| 4471 | for elements that update markers that were not marked, | 4482 | for elements that update markers that were not marked, |
| 4472 | and delete them. */ | 4483 | and delete them. */ |
| @@ -4510,17 +4521,6 @@ returns nil, because real GC can't be done. */) | |||
| 4510 | } | 4521 | } |
| 4511 | } | 4522 | } |
| 4512 | 4523 | ||
| 4513 | #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES | ||
| 4514 | mark_stack (); | ||
| 4515 | #endif | ||
| 4516 | |||
| 4517 | #ifdef USE_GTK | ||
| 4518 | { | ||
| 4519 | extern void xg_mark_data (); | ||
| 4520 | xg_mark_data (); | ||
| 4521 | } | ||
| 4522 | #endif | ||
| 4523 | |||
| 4524 | gc_sweep (); | 4524 | gc_sweep (); |
| 4525 | 4525 | ||
| 4526 | /* Clear the mark bits that we set in certain root slots. */ | 4526 | /* Clear the mark bits that we set in certain root slots. */ |
| @@ -4978,6 +4978,14 @@ mark_object (arg) | |||
| 4978 | break; | 4978 | break; |
| 4979 | 4979 | ||
| 4980 | case Lisp_Misc: | 4980 | case Lisp_Misc: |
| 4981 | if (XMISCTYPE (obj) == Lisp_Misc_Free) | ||
| 4982 | { | ||
| 4983 | /* This is (probably) a freed marker which may still exist on | ||
| 4984 | a buffer undo list, so accept it here, as check below will | ||
| 4985 | fail (not live). KFS 2004-05-17 */ | ||
| 4986 | XMARKER (obj)->gcmarkbit = 1; | ||
| 4987 | break; | ||
| 4988 | } | ||
| 4981 | CHECK_ALLOCATED_AND_LIVE (live_misc_p); | 4989 | CHECK_ALLOCATED_AND_LIVE (live_misc_p); |
| 4982 | if (XMARKER (obj)->gcmarkbit) | 4990 | if (XMARKER (obj)->gcmarkbit) |
| 4983 | break; | 4991 | break; |