places and GC: subtarct terminated place's memory use

When a child place terminates, the parent's count of the child's
memory use needs to be updated. Until this repair, the
`current-memory-use` function has been reporting an incorrectly large
number after a place terminates.
This commit is contained in:
Matthew Flatt 2018-08-11 09:48:32 -06:00
parent 15186ff41c
commit cf396064c3
2 changed files with 25 additions and 3 deletions

View File

@ -963,6 +963,20 @@ void GC_register_traversers(short tag, Size_Proc size, Mark_Proc mark,
(Fixup2_Proc)fixup, constant_Size, atomic);
}
static uintptr_t get_place_child_memory_use()
{
#ifdef MZ_USE_PLACES
NewGC *gc = GC_get_GC();
uintptr_t amt;
mzrt_mutex_lock(gc->child_total_lock);
amt = gc->child_gc_total;
mzrt_mutex_unlock(gc->child_total_lock);
return amt;
#else
return 0;
#endif
}
intptr_t GC_get_memory_use(void *o)
{
NewGC *gc = GC_get_GC();
@ -975,9 +989,7 @@ intptr_t GC_get_memory_use(void *o)
amt = add_no_overflow(gen0_size_in_use(gc), gc->memory_in_use);
amt = add_no_overflow(amt, gc->gen0_phantom_count);
#ifdef MZ_USE_PLACES
mzrt_mutex_lock(gc->child_total_lock);
amt = add_no_overflow(amt, gc->child_gc_total);
mzrt_mutex_unlock(gc->child_total_lock);
amt = add_no_overflow(amt, get_place_child_memory_use());
#endif
return (intptr_t)amt;
@ -6286,6 +6298,7 @@ void GC_dump_with_traces(int flags,
GCWARN((GCOUTF,"\n"));
GCWARN((GCOUTF,"Current memory use: %" PRIdPTR "\n", GC_get_memory_use(NULL)));
GCWARN((GCOUTF," part current use from child places: %" PRIdPTR "\n", get_place_child_memory_use()));
GCWARN((GCOUTF,"Peak memory use before a collection: %" PRIdPTR "\n", gc->peak_pre_memory_use));
GCWARN((GCOUTF,"Peak memory use after a collection: %" PRIdPTR "\n", gc->peak_memory_use));
GCWARN((GCOUTF,"Allocated (+reserved) page sizes: %" PRIdPTR " (+%" PRIdPTR ")\n",

View File

@ -354,6 +354,15 @@ void GC_destruct_child_gc() {
}
} while (waiting == 1);
if (gc->parent_gc) {
/* update parent's view of memory use */
intptr_t delta = -gc->previously_reported_total;
mzrt_mutex_lock(gc->parent_gc->child_total_lock);
gc->parent_gc->child_gc_total += delta;
mzrt_mutex_unlock(gc->parent_gc->child_total_lock);
gc->previously_reported_total = 0;
}
free_child_gc();
}