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.
This commit is contained in:
Takashi Kokubun 2021-05-20 03:33:28 -07:00
parent 5026f9a5d5
commit dfe21ef7a1
No known key found for this signature in database
GPG Key ID: 6FFC433B12EE23DD

View File

@ -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");