From 1216f5e4132d14cad310cb8ac6fb91fac41569f7 Mon Sep 17 00:00:00 2001 From: Gerd Moellmann Date: Thu, 17 Feb 2000 15:23:58 +0000 Subject: [PATCH] (GC_USE_GCPROS_AS_BEFORE, GC_MAKE_GCPROS_NOOPS) (GC_MARK_STACK_CHECK_GCPROS, GC_USE_GCPROS_CHECK_ZOMBIES) [GC_MARK_STACK]: New defines. (GCPRO1, GCPRO2, GCPRO3, GCPRO4, GCPRO5, UNGCPRO) [GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS]: Define as no-ops. --- src/ChangeLog | 41 +++++++++++++++++++++++++++++++++++++++++ src/lisp.h | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/src/ChangeLog b/src/ChangeLog index 36092bdbe61..a383d08cc1f 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,46 @@ 2000-02-17 Gerd Moellmann + * alloc.c (mark_object): Don't mark symbol names in pure space. + (gc_sweep): Don't unmark symbol names in pure space. + + * lisp.h (GC_USE_GCPROS_AS_BEFORE, GC_MAKE_GCPROS_NOOPS) + (GC_MARK_STACK_CHECK_GCPROS, GC_USE_GCPROS_CHECK_ZOMBIES) + [GC_MARK_STACK]: New defines. + (GCPRO1, GCPRO2, GCPRO3, GCPRO4, GCPRO5, UNGCPRO) + [GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS]: Define as no-ops. + + * emacs.c (main) [GC_MARK_STACK]: Initialize stack_base. + + * buffer.c (Fget_buffer_create, Fmake_indirect_buffer): Use + allocate_buffer instead of xmalloc. + + * alloc.c (toplevel): Include setjmp.h. + (PURE_POINTER_P): New define. + (enum mem_type) [GC_MARK_STACK]: New enumeration. + (Vdead) [GC_MARK_STACK]: New variable. + (lisp_malloc): Add parameter TYPE, call mem_insert if + GC_MARK_STACK is defined. + (allocate_buffer): New function. + (lisp_free) [GC_MARK_STACK]: Call mem_delete. + (free_float) [GC_MARK_STACK]: Set type to Vdead. + (free_cons) [GC_MARK_STACK]: Set car to Vdead. + (stack_base, mem_root, mem_z) [GC_MARK_STACK]: New variables. + (MEM_NIL) [GC_MARK_STACK]: New define. + (struct mem_node) [GC_MARK_STACK]: New structure. + (mem_init, mem_find, mem_insert, mem_delete, mem_insert_fixup) + (mem_delete_fixup, mem_rotate_left, mem_rotate_right) + (live_string_p, live_cons_p, live_symbol_p, live_float_p) + (live_misc_p, live_vector_p, live_buffer_p, mark_memory) + (mark_stack) [GC_MARK_STACK]: New functions. + (Fgarbage_collect) [GC_MARK_STACK]: Call mark_stack. + (clear_marks): Removed. + (gc_sweep): Set free conses' car, free floats' type, free + symbols' function to Vdead. Use lisp_free to free buffers. + (init_alloc_once): Initialize Vdead. + (survives_gc_p): Return non-zero for pure objects. + + * alloc.c: Add comments throughout the file. + * atimer.c (stop_other_atimers): Don't call cancel_atimer because that unblocks alarms. diff --git a/src/lisp.h b/src/lisp.h index a826e35870e..a398c9a581a 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -1578,6 +1578,36 @@ struct gcpro #endif }; +/* Values of GC_MARK_STACK during compilation: + + 0 Use GCPRO as before + 1 Do the real thing, make GCPROs and UNGCPRO no-ops. + 2 Mark the stack, and check that everything GCPRO'd is + marked. + 3 Mark using GCPRO's, mark stack last, and count how many + dead objects are kept alive. */ + + +#define GC_USE_GCPROS_AS_BEFORE 0 +#define GC_MAKE_GCPROS_NOOPS 1 +#define GC_MARK_STACK_CHECK_GCPROS 2 +#define GC_USE_GCPROS_CHECK_ZOMBIES 3 + +#ifndef GC_MARK_STACK +#define GC_MARK_STACK GC_USE_GCPROS_AS_BEFORE +#endif + +#if GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS + +#define GCPRO1(varname) ((void) 0) +#define GCPRO2(varname1, varname2)((void) 0) +#define GCPRO3(varname1, varname2, varname3) ((void) 0) +#define GCPRO4(varname1, varname2, varname3, varname4) ((void) 0) +#define GCPRO5(varname1, varname2, varname3, varname4, varname5) ((void) 0) +#define UNGCPRO ((void) 0) + +#else /* GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS */ + #ifndef DEBUG_GCPRO #define GCPRO1(varname) \ @@ -1661,6 +1691,8 @@ extern int gcpro_level; : ((gcprolist = gcpro1.next), 0)) #endif /* DEBUG_GCPRO */ +#endif /* GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS */ + /* Evaluate expr, UNGCPRO, and then return the value of expr. */ #define RETURN_UNGCPRO(expr) \ -- 2.39.5