diff --git a/src/mzscheme/gc2/newgc.c b/src/mzscheme/gc2/newgc.c index 17359f27b0..d2b420a4bf 100644 --- a/src/mzscheme/gc2/newgc.c +++ b/src/mzscheme/gc2/newgc.c @@ -206,7 +206,10 @@ static void *ofm_malloc_zero(size_t size) { inline static void check_used_against_max(NewGC *gc, size_t len) { - gc->used_pages += (len / APAGE_SIZE) + (((len % APAGE_SIZE) == 0) ? 0 : 1); + long delta; + + delta = (len / APAGE_SIZE) + (((len % APAGE_SIZE) == 0) ? 0 : 1); + gc->used_pages += delta; if(gc->in_unsafe_allocation_mode) { if(gc->used_pages > gc->max_pages_in_heap) @@ -219,8 +222,10 @@ inline static void check_used_against_max(NewGC *gc, size_t len) if(gc->used_pages > gc->max_pages_for_use) { /* too much memory allocated. * Inform the thunk and then die semi-gracefully */ - if(GC_out_of_memory) + if(GC_out_of_memory) { + gc->used_pages -= delta; GC_out_of_memory(); + } out_of_memory(); } } @@ -537,6 +542,7 @@ static void *allocate_big(const size_t request_size_bytes, int type) NewGC *gc = GC_get_GC(); mpage *bpage; size_t allocate_size; + void *addr; #ifdef NEWGC_BTC_ACCOUNT if(GC_out_of_memory) { @@ -563,16 +569,20 @@ static void *allocate_big(const size_t request_size_bytes, int type) if (!gc->dumping_avoid_collection) garbage_collect(gc, 0); } - gc->gen0.current_size += allocate_size; - /* We not only need APAGE_SIZE alignment, we + /* The following allocations may fail and escape if GC_out_of_memory is set. + We not only need APAGE_SIZE alignment, we need everything consisently mapped within an APAGE_SIZE segment. So round up. */ - bpage = malloc_mpage(); if (type == PAGE_ATOMIC) - bpage->addr = malloc_dirty_pages(gc, round_to_apage_size(allocate_size), APAGE_SIZE); + addr = malloc_dirty_pages(gc, round_to_apage_size(allocate_size), APAGE_SIZE); else - bpage->addr = malloc_pages(gc, round_to_apage_size(allocate_size), APAGE_SIZE); + addr = malloc_pages(gc, round_to_apage_size(allocate_size), APAGE_SIZE); + + gc->gen0.current_size += allocate_size; + + bpage = malloc_mpage(); + bpage->addr = addr; bpage->size = allocate_size; bpage->size_class = 2; bpage->page_type = type; diff --git a/src/mzscheme/src/fun.c b/src/mzscheme/src/fun.c index fffd418519..45da74c0ce 100644 --- a/src/mzscheme/src/fun.c +++ b/src/mzscheme/src/fun.c @@ -551,7 +551,7 @@ scheme_init_fun (Scheme_Env *env) Scheme_Object *a[1]; a[0] = scheme_intern_symbol("default"); scheme_default_prompt_tag = make_prompt_tag(1, a); - scheme_hash_key(SCHEME_PTR_VAL(scheme_default_prompt_tag)); + (void)scheme_hash_key(SCHEME_PTR_VAL(scheme_default_prompt_tag)); } REGISTER_SO(original_default_prompt); diff --git a/src/mzscheme/src/module.c b/src/mzscheme/src/module.c index 9040900530..5cfdbbc168 100644 --- a/src/mzscheme/src/module.c +++ b/src/mzscheme/src/module.c @@ -338,7 +338,7 @@ void scheme_init_module(Scheme_Env *env) scheme_make_pair(kernel_symbol, scheme_null)), scheme_false, kernel_modname); - scheme_hash_key(kernel_modidx); + (void)scheme_hash_key(kernel_modidx); unsafe_modname = scheme_intern_resolved_module_path(scheme_intern_symbol("#%unsafe")); REGISTER_SO(module_symbol); @@ -5568,7 +5568,7 @@ static Scheme_Object *do_module(Scheme_Object *form, Scheme_Comp_Env *env, REGISTER_SO(empty_self_modidx); REGISTER_SO(empty_self_modname); empty_self_modidx = scheme_make_modidx(scheme_false, scheme_false, scheme_false); - scheme_hash_key(empty_self_modidx); + (void)scheme_hash_key(empty_self_modidx); empty_self_modname = scheme_make_symbol("expanded module"); /* uninterned */ empty_self_modname = scheme_intern_resolved_module_path(empty_self_modname); } diff --git a/src/mzscheme/src/schpriv.h b/src/mzscheme/src/schpriv.h index 9f3d3d5175..cadbec9a29 100644 --- a/src/mzscheme/src/schpriv.h +++ b/src/mzscheme/src/schpriv.h @@ -907,6 +907,7 @@ void scheme_load_delayed_syntax(struct Resolve_Prefix *rp, long i); XFORM_NONGCING Scheme_Object *scheme_phase_index_symbol(int src_phase_index); Scheme_Object *scheme_explode_syntax(Scheme_Object *stx, Scheme_Hash_Table *ht); +void scheme_populate_pt_ht(struct Scheme_Module_Phase_Exports * pt); /*========================================================================*/ /* syntax run-time structures */