From 07a4943d550a60e711b19d4c156c094e70d7ba28 Mon Sep 17 00:00:00 2001 From: k0kubun Date: Sat, 24 Feb 2018 00:40:36 +0000 Subject: mjit.c: fix deadlock on marking MJIT's ISeq git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62549 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- mjit.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'mjit.c') diff --git a/mjit.c b/mjit.c index b8cb4f5424..0cd2839d80 100644 --- a/mjit.c +++ b/mjit.c @@ -1453,7 +1453,14 @@ mjit_mark(void) CRITICAL_SECTION_START(4, "mjit_mark"); for (node = unit_queue.head; node != NULL; node = node->next) { if (node->unit->iseq) { /* ISeq is still not GCed */ - rb_gc_mark((VALUE)node->unit->iseq); + VALUE iseq = (VALUE)node->unit->iseq; + CRITICAL_SECTION_FINISH(4, "mjit_mark rb_gc_mark"); + + /* Don't wrap critical section with this. This may trigger GC, + and in that case mjit_gc_start_hook causes deadlock. */ + rb_gc_mark(iseq); + + CRITICAL_SECTION_START(4, "mjit_mark rb_gc_mark"); } } CRITICAL_SECTION_FINISH(4, "mjit_mark"); -- cgit v1.2.3