Skip to content

Commit 36d3445

Browse files
committed
Thread safe jl_gc_enable
1 parent 7a06413 commit 36d3445

File tree

4 files changed

+26
-10
lines changed

4 files changed

+26
-10
lines changed

src/ast.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ static jl_value_t *resolve_globals(jl_value_t *expr, jl_lambda_info_t *lam);
201201

202202
static jl_value_t *scm_to_julia(value_t e, int expronly)
203203
{
204-
int en = jl_gc_enable(0);
204+
int en = jl_gc_enable(0); // Might GC
205205
jl_value_t *v;
206206
JL_TRY {
207207
v = scm_to_julia_(e, expronly);

src/dump.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1974,7 +1974,7 @@ JL_DLLEXPORT jl_value_t *jl_ast_rettype(jl_lambda_info_t *li, jl_value_t *ast)
19741974
ios_mem(&src, 0);
19751975
ios_setbuf(&src, (char*)bytes->data, jl_array_len(bytes), 0);
19761976
src.size = jl_array_len(bytes);
1977-
int en = jl_gc_enable(0);
1977+
int en = jl_gc_enable(0); // Might GC
19781978
jl_value_t *rt = jl_deserialize_value(&src, NULL);
19791979
jl_gc_enable(en);
19801980
tree_literal_values = NULL;
@@ -1994,7 +1994,7 @@ JL_DLLEXPORT jl_value_t *jl_compress_ast(jl_lambda_info_t *li, jl_value_t *ast)
19941994
ios_mem(&dest, 0);
19951995
jl_array_t *last_tlv = tree_literal_values;
19961996
jl_module_t *last_tem = tree_enclosing_module;
1997-
int en = jl_gc_enable(0);
1997+
int en = jl_gc_enable(0); // Might GC
19981998

19991999
if (li->module->constant_table == NULL) {
20002000
li->module->constant_table = jl_alloc_cell_1d(0);
@@ -2038,7 +2038,7 @@ JL_DLLEXPORT jl_value_t *jl_uncompress_ast(jl_lambda_info_t *li, jl_value_t *dat
20382038
ios_mem(&src, 0);
20392039
ios_setbuf(&src, (char*)bytes->data, jl_array_len(bytes), 0);
20402040
src.size = jl_array_len(bytes);
2041-
int en = jl_gc_enable(0);
2041+
int en = jl_gc_enable(0); // Might GC
20422042
(void)jl_deserialize_value(&src, NULL); // skip ret type
20432043
jl_value_t *v = jl_deserialize_value(&src, NULL);
20442044
jl_gc_enable(en);

src/gc.c

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2144,15 +2144,29 @@ static void post_mark(arraylist_t *list, int dryrun)
21442144
}
21452145

21462146
// collector entry point and control
2147+
static volatile uint64_t jl_gc_disable_counter = 0;
21472148

2148-
static int is_gc_enabled = 1;
21492149
JL_DLLEXPORT int jl_gc_enable(int on)
21502150
{
2151-
int prev = is_gc_enabled;
2152-
is_gc_enabled = (on!=0);
2151+
jl_tls_states_t *ptls = jl_get_ptls_states();
2152+
int prev = !ptls->disable_gc;
2153+
ptls->disable_gc = (on == 0);
2154+
if (on && !prev) {
2155+
// disable -> enable
2156+
JL_ATOMIC_FETCH_AND_ADD(jl_gc_disable_counter, -1);
2157+
}
2158+
else if (prev && !on) {
2159+
// enable -> disable
2160+
JL_ATOMIC_FETCH_AND_ADD(jl_gc_disable_counter, 1);
2161+
// check if the GC is running and wait for it to finish
2162+
jl_gc_safepoint();
2163+
}
21532164
return prev;
21542165
}
2155-
JL_DLLEXPORT int jl_gc_is_enabled(void) { return is_gc_enabled; }
2166+
JL_DLLEXPORT int jl_gc_is_enabled(void)
2167+
{
2168+
return !jl_get_ptls_states()->disable_gc;
2169+
}
21562170

21572171
JL_DLLEXPORT int64_t jl_gc_total_bytes(void) { return total_allocd_bytes + allocd_bytes + collect_interval; }
21582172
JL_DLLEXPORT uint64_t jl_gc_total_hrtime(void) { return total_gc_time; }
@@ -2455,7 +2469,7 @@ static void _jl_gc_collect(int full, char *stack_hi)
24552469

24562470
JL_DLLEXPORT void jl_gc_collect(int full)
24572471
{
2458-
if (!is_gc_enabled || jl_in_gc)
2472+
if (jl_gc_disable_counter || jl_in_gc)
24592473
return;
24602474
char *stack_hi = (char*)gc_get_stack_ptr();
24612475
gc_debug_print();
@@ -2482,7 +2496,8 @@ JL_DLLEXPORT void jl_gc_collect(int full)
24822496
jl_gc_signal_begin();
24832497

24842498
jl_in_gc = 1;
2485-
_jl_gc_collect(full, stack_hi);
2499+
if (!jl_gc_disable_counter)
2500+
_jl_gc_collect(full, stack_hi);
24862501
jl_in_gc = 0;
24872502

24882503
// Need to reset the page protection before resetting the flag since

src/julia.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1459,6 +1459,7 @@ typedef struct _jl_tls_states_t {
14591459
// execute at the same time with the GC.
14601460
volatile int8_t gc_state;
14611461
volatile int8_t in_gc;
1462+
int8_t disable_gc;
14621463
struct _jl_thread_heap_t *heap;
14631464
jl_task_t *volatile current_task;
14641465
jl_task_t *root_task;

0 commit comments

Comments
 (0)