1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Avoid hanging on --jit-wait after MJIT.pause

When a worker is stopped, nobody will JIT a method for you.
This commit is contained in:
Takashi Kokubun 2021-01-03 00:05:00 -08:00
parent 09ec8d6866
commit 4724bf856f
No known key found for this signature in database
GPG key ID: 6FFC433B12EE23DD
3 changed files with 12 additions and 1 deletions

3
mjit.c
View file

@ -328,6 +328,9 @@ mjit_wait(struct rb_iseq_constant_body *body)
VALUE VALUE
rb_mjit_wait_call(rb_execution_context_t *ec, struct rb_iseq_constant_body *body) rb_mjit_wait_call(rb_execution_context_t *ec, struct rb_iseq_constant_body *body)
{ {
if (worker_stopped)
return Qundef;
mjit_wait(body); mjit_wait(body);
if ((uintptr_t)body->jit_func <= (uintptr_t)LAST_JIT_ISEQ_FUNC) { if ((uintptr_t)body->jit_func <= (uintptr_t)LAST_JIT_ISEQ_FUNC) {
return Qundef; return Qundef;

View file

@ -236,7 +236,7 @@ static int total_unloads = 0;
// Set to true to stop worker. // Set to true to stop worker.
static bool stop_worker_p; static bool stop_worker_p;
// Set to true if worker is stopped. // Set to true if worker is stopped.
static bool worker_stopped; static bool worker_stopped = true;
// Path of "/tmp", which can be changed to $TMP in MinGW. // Path of "/tmp", which can be changed to $TMP in MinGW.
static char *tmp_dir; static char *tmp_dir;

View file

@ -1070,6 +1070,14 @@ class TestJIT < Test::Unit::TestCase
end; end;
end end
def test_mjit_pause_wait
assert_eval_with_jit("#{<<~"begin;"}\n#{<<~"end;"}", stdout: '', success_count: 0, min_calls: 1)
begin;
RubyVM::MJIT.pause
proc {}.call
end;
end
def test_caller_locations_without_catch_table def test_caller_locations_without_catch_table
out, _ = eval_with_jit("#{<<~"begin;"}\n#{<<~"end;"}", min_calls: 1) out, _ = eval_with_jit("#{<<~"begin;"}\n#{<<~"end;"}", min_calls: 1)
begin; begin;