aboutsummaryrefslogtreecommitdiffstats
path: root/mjit_worker.c
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2021-05-20 03:33:28 -0700
committerTakashi Kokubun <takashikkbn@gmail.com>2021-05-20 03:33:29 -0700
commitdfe21ef7a15a30fc33f3a5cc089e15d09e905eb4 (patch)
treea5129b4bd2f26063e16c5666099ee3940fcd89a1 /mjit_worker.c
parent5026f9a5d5012248729a0052cd6cec811748291b (diff)
downloadruby-dfe21ef7a15a30fc33f3a5cc089e15d09e905eb4.tar.gz
Do not block JIT with pending_stale_p
Because we want to flush pending stale units before unloading units, the pending_stale_p check is implemented in this waiting loop. However, once all methods are called more than --jit-min-calls, mjit_worker_wakeup will not be signaled again. As a result, when mjit_recompile is called after that and pending_stale_p becomes true, MJIT stops processing methods in the unit queue even if the queue is very long and MJIT does nothing, waiting for the signal. There should be a better way to handle this, but as a fix to be backported to Ruby 3.0, let me make an obvious simple commit here.
Diffstat (limited to 'mjit_worker.c')
-rw-r--r--mjit_worker.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/mjit_worker.c b/mjit_worker.c
index c34f85c769..24bc5c2473 100644
--- a/mjit_worker.c
+++ b/mjit_worker.c
@@ -1368,7 +1368,7 @@ mjit_worker(void)
// Wait until a unit becomes available
CRITICAL_SECTION_START(3, "in worker dequeue");
- while ((pending_stale_p || list_empty(&unit_queue.head) || active_units.length >= mjit_opts.max_cache_size) && !stop_worker_p) {
+ while ((list_empty(&unit_queue.head) || active_units.length >= mjit_opts.max_cache_size) && !stop_worker_p) {
rb_native_cond_wait(&mjit_worker_wakeup, &mjit_engine_mutex);
verbose(3, "Getting wakeup from client");