summaryrefslogtreecommitdiff
path: root/mjit.c
diff options
context:
space:
mode:
authork0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-02-24 00:40:36 +0000
committerk0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-02-24 00:40:36 +0000
commit07a4943d550a60e711b19d4c156c094e70d7ba28 (patch)
tree9f92233aa0c0f9804d84057cb67998337175a7eb /mjit.c
parentdaad618740a3ce9e266086cf7dfa7adcfb239a20 (diff)
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
Diffstat (limited to 'mjit.c')
-rw-r--r--mjit.c9
1 files changed, 8 insertions, 1 deletions
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");