Skip to content

Commit

Permalink
Add a build-time flag WITH_GC_FIXED_HEAP
Browse files Browse the repository at this point in the history
  • Loading branch information
qinsoon committed Mar 25, 2024
1 parent f1185aa commit 068fb2d
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 7 deletions.
6 changes: 6 additions & 0 deletions Make.inc
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
32 changes: 25 additions & 7 deletions src/gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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);
Expand All @@ -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);
}
}

Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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();
}
Expand All @@ -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);
}
Expand All @@ -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);
}
Expand All @@ -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
}
}

Expand All @@ -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);
Expand Down

0 comments on commit 068fb2d

Please sign in to comment.