diff options
-rw-r--r-- | gc.c | 2 | ||||
-rw-r--r-- | mjit.c | 13 | ||||
-rw-r--r-- | mjit_worker.c | 4 |
3 files changed, 13 insertions, 6 deletions
@@ -8834,10 +8834,12 @@ gc_compact(rb_objspace_t *objspace, int use_toward_empty, int use_double_pages, objspace->flags.during_compacting = TRUE; { + mjit_gc_start_hook(); /* pin objects referenced by maybe pointers */ garbage_collect(objspace, GPR_DEFAULT_REASON); /* compact */ gc_compact_after_gc(objspace, use_toward_empty, use_double_pages, use_verifier); + mjit_gc_exit_hook(); } objspace->flags.during_compacting = FALSE; } @@ -96,7 +96,7 @@ mjit_gc_start_hook(void) rb_native_cond_wait(&mjit_client_wakeup, &mjit_engine_mutex); verbose(4, "Getting wakeup from a worker for GC"); } - in_gc = true; + in_gc++; CRITICAL_SECTION_FINISH(4, "mjit_gc_start_hook"); } @@ -108,9 +108,14 @@ mjit_gc_exit_hook(void) if (!mjit_enabled) return; CRITICAL_SECTION_START(4, "mjit_gc_exit_hook"); - in_gc = false; - verbose(4, "Sending wakeup signal to workers after GC"); - rb_native_cond_broadcast(&mjit_gc_wakeup); + in_gc--; + if (in_gc < 0) { // Don't allow underflow + in_gc = 0; + } + if (!in_gc) { + verbose(4, "Sending wakeup signal to workers after GC"); + rb_native_cond_broadcast(&mjit_gc_wakeup); + } CRITICAL_SECTION_FINISH(4, "mjit_gc_exit_hook"); } diff --git a/mjit_worker.c b/mjit_worker.c index 461b10f0ef..63f976a2b9 100644 --- a/mjit_worker.c +++ b/mjit_worker.c @@ -220,8 +220,8 @@ static rb_nativethread_cond_t mjit_client_wakeup; static rb_nativethread_cond_t mjit_worker_wakeup; // A thread conditional to wake up workers if at the end of GC. static rb_nativethread_cond_t mjit_gc_wakeup; -// True when GC is working. -static bool in_gc = false; +// Greater than 0 when GC is working. +static int in_gc = 0; // True when JIT is working. static bool in_jit = false; // True when JIT compaction is running. |