X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Falloc.c;h=54f3c38f0965c6ab645dfdbedda435bfb4b42c42;hb=8ccf542c980645ba3c02074a8bc67cd4fc8e7a1f;hp=50de95c0ba6df81f410774ec3b3dc02251a35625;hpb=1cc5b779cb8755e01e02aead4fba711c06158b90;p=chise%2Fxemacs-chise.git.1 diff --git a/src/alloc.c b/src/alloc.c index 50de95c..54f3c38 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -412,7 +412,7 @@ free_lcrecord (struct lcrecord_header *lcrecord) break; } else if (next == 0) - abort (); + ABORT (); else header = next; } @@ -2051,6 +2051,10 @@ LENGTH must be a non-negative integer. Bufbyte *init_ptr = init_str; switch (len) { +#ifdef UTF2000 + case 6: *ptr++ = *init_ptr++; + case 5: *ptr++ = *init_ptr++; +#endif case 4: *ptr++ = *init_ptr++; case 3: *ptr++ = *init_ptr++; case 2: *ptr++ = *init_ptr++; @@ -2473,7 +2477,8 @@ static struct int instances_freed; int bytes_freed; int instances_on_free_list; -} lcrecord_stats [countof (lrecord_implementations_table)]; +} lcrecord_stats [countof (lrecord_implementations_table) + + MODULE_DEFINABLE_TYPE_COUNT]; static void tick_lcrecord_stats (const struct lrecord_header *h, int free_p) @@ -3242,6 +3247,61 @@ restore_gc_inhibit (Lisp_Object val) /* Maybe we want to use this when doing a "panic" gc after memory_full()? */ static int gc_hooks_inhibited; +struct post_gc_action +{ + void (*fun) (void *); + void *arg; +}; + +typedef struct post_gc_action post_gc_action; + +typedef struct +{ + Dynarr_declare (post_gc_action); +} post_gc_action_dynarr; + +static post_gc_action_dynarr *post_gc_actions; + +/* Register an action to be called at the end of GC. + gc_in_progress is 0 when this is called. + This is used when it is discovered that an action needs to be taken, + but it's during GC, so it's not safe. (e.g. in a finalize method.) + + As a general rule, do not use Lisp objects here. + And NEVER signal an error. +*/ + +void +register_post_gc_action (void (*fun) (void *), void *arg) +{ + post_gc_action action; + + if (!post_gc_actions) + post_gc_actions = Dynarr_new (post_gc_action); + + action.fun = fun; + action.arg = arg; + + Dynarr_add (post_gc_actions, action); +} + +static void +run_post_gc_actions (void) +{ + int i; + + if (post_gc_actions) + { + for (i = 0; i < Dynarr_length (post_gc_actions); i++) + { + post_gc_action action = Dynarr_at (post_gc_actions, i); + (action.fun) (action.arg); + } + + Dynarr_reset (post_gc_actions); + } +} + void garbage_collect_1 (void) @@ -3331,6 +3391,7 @@ garbage_collect_1 (void) /***** Now we actually start the garbage collection. */ gc_in_progress = 1; + inhibit_non_essential_printing_operations = 1; gc_generation_number[0]++; @@ -3455,8 +3516,11 @@ garbage_collect_1 (void) gc_cons_threshold = 10000; #endif + inhibit_non_essential_printing_operations = 0; gc_in_progress = 0; + run_post_gc_actions (); + /******* End of garbage collection ********/ run_hook_trapping_errors ("Error in post-gc-hook", Qpost_gc_hook); @@ -3824,8 +3888,8 @@ reinit_alloc_once_early (void) #ifdef DOUG_LEA_MALLOC mallopt (M_TRIM_THRESHOLD, 128*1024); /* trim threshold */ mallopt (M_MMAP_THRESHOLD, 64*1024); /* mmap threshold */ -#if 0 /* Moved to emacs.c */ - mallopt (M_MMAP_MAX, 64); /* max. number of mmap'ed areas */ +#if 1 /* Moved to emacs.c */ + mallopt (M_MMAP_MAX, 0); /* max. number of mmap'ed areas */ #endif #endif init_string_alloc ();