diff --git a/Make.inc b/Make.inc index b80ddf8873a9e8..4414f1a6911ba9 100644 --- a/Make.inc +++ b/Make.inc @@ -85,6 +85,7 @@ HAVE_SSP := 0 # GC debugging options WITH_GC_VERIFY := 0 WITH_GC_DEBUG_ENV := 0 +WITH_GC_FIXED_HEAP := 0 # MMTk GC WITH_MMTK ?= 0 @@ -738,6 +739,11 @@ JCXXFLAGS += -DGC_DEBUG_ENV JCFLAGS += -DGC_DEBUG_ENV endif +ifeq ($(WITH_GC_FIXED_HEAP), 1) +JCXXFLAGS += -DGC_FIXED_HEAP +JCFLAGS += -DGC_FIXED_HEAP +endif + ifeq ($(WITH_MMTK), 1) ifeq (${MMTK_JULIA_DIR},) $(error MMTK_JULIA_DIR must be set to use MMTk) diff --git a/src/gc.c b/src/gc.c index b1a1fa09289a0b..02399720fcf6aa 100644 --- a/src/gc.c +++ b/src/gc.c @@ -25,10 +25,12 @@ _Atomic(int) gc_master_tid; uv_mutex_t gc_threads_lock; uv_cond_t gc_threads_cond; +#ifdef GC_FIXED_HEAP // Globally allocated bytes by malloc - used for fixed heap size _Atomic(uint64_t) malloc_bytes; // Globally allocated pool pages - used for fixed heap size extern uint64_t jl_current_pg_count(void); +#endif // Linked list of callback functions @@ -580,6 +582,7 @@ void gc_setmark_buf(jl_ptls_t ptls, void *o, uint8_t mark_mode, size_t minsz) JL inline void maybe_collect(jl_ptls_t ptls) { +#ifdef GC_FIXED_HEAP if (jl_options.fixed_heap_size) { uint64_t current_heap_size = ((uint64_t)jl_current_pg_count()) << (uint64_t)14; current_heap_size += jl_atomic_load_relaxed(&malloc_bytes); @@ -588,13 +591,14 @@ inline void maybe_collect(jl_ptls_t ptls) } else { jl_gc_safepoint_(ptls); } - } else { - if (jl_atomic_load_relaxed(&ptls->gc_num.allocd) >= 0 || jl_gc_debug_check_other()) { - jl_gc_collect(JL_GC_AUTO); - } - else { - jl_gc_safepoint_(ptls); - } + return; + } +#endif + if (jl_atomic_load_relaxed(&ptls->gc_num.allocd) >= 0 || jl_gc_debug_check_other()) { + jl_gc_collect(JL_GC_AUTO); + } + else { + jl_gc_safepoint_(ptls); } } @@ -2848,12 +2852,14 @@ static int _jl_gc_collect(jl_ptls_t ptls, jl_gc_collection_t collection) } } +#ifdef GC_FIXED_HEAP if (jl_options.fixed_heap_size) { uint64_t current_heap_size = ((uint64_t)jl_current_pg_count()) << ((uint64_t)14); if (current_heap_size > (jl_options.fixed_heap_size * 4 / 5)) { next_sweep_full = 1; } } +#endif gc_time_summary(sweep_full, t_start, gc_end_time, gc_num.freed, live_bytes, gc_num.interval, pause, @@ -3061,10 +3067,12 @@ void jl_gc_init(void) if (jl_options.heap_size_hint) jl_gc_set_max_memory(jl_options.heap_size_hint); +#ifdef GC_FIXED_HEAP if (jl_options.fixed_heap_size) { // This guarantees that we will not trigger a GC before reaching heap limit gc_num.interval = jl_options.fixed_heap_size; } +#endif t_start = jl_hrtime(); } @@ -3082,7 +3090,9 @@ JL_DLLEXPORT void *jl_gc_counted_malloc(size_t sz) jl_atomic_load_relaxed(&ptls->gc_num.allocd) + sz); jl_atomic_store_relaxed(&ptls->gc_num.malloc, jl_atomic_load_relaxed(&ptls->gc_num.malloc) + 1); +#ifdef GC_FIXED_HEAP jl_atomic_fetch_add_relaxed(&malloc_bytes, sz); +#endif } return malloc(sz); } @@ -3098,7 +3108,9 @@ JL_DLLEXPORT void *jl_gc_counted_calloc(size_t nm, size_t sz) jl_atomic_load_relaxed(&ptls->gc_num.allocd) + nm*sz); jl_atomic_store_relaxed(&ptls->gc_num.malloc, jl_atomic_load_relaxed(&ptls->gc_num.malloc) + 1); +#ifdef GC_FIXED_HEAP jl_atomic_fetch_add_relaxed(&malloc_bytes, nm * sz); +#endif } return calloc(nm, sz); } @@ -3114,7 +3126,9 @@ JL_DLLEXPORT void jl_gc_counted_free_with_size(void *p, size_t sz) jl_atomic_load_relaxed(&ptls->gc_num.freed) + sz); jl_atomic_store_relaxed(&ptls->gc_num.freecall, jl_atomic_load_relaxed(&ptls->gc_num.freecall) + 1); +#ifdef GC_FIXED_HEAP jl_atomic_fetch_add_relaxed(&malloc_bytes, -sz); +#endif } } @@ -3128,11 +3142,15 @@ JL_DLLEXPORT void *jl_gc_counted_realloc_with_old_size(void *p, size_t old, size if (sz < old) { jl_atomic_store_relaxed(&ptls->gc_num.freed, jl_atomic_load_relaxed(&ptls->gc_num.freed) + (old - sz)); +#ifdef GC_FIXED_HEAP jl_atomic_fetch_add_relaxed(&malloc_bytes, old - sz); +#endif } else { jl_atomic_store_relaxed(&ptls->gc_num.allocd, jl_atomic_load_relaxed(&ptls->gc_num.allocd) + (sz - old)); +#ifdef GC_FIXED_HEAP jl_atomic_fetch_add_relaxed(&malloc_bytes, sz - old); +#endif } jl_atomic_store_relaxed(&ptls->gc_num.realloc, jl_atomic_load_relaxed(&ptls->gc_num.realloc) + 1);