[前][次][番号順一覧][スレッド一覧]

ruby-changes:60378

From: Takashi <ko1@a...>
Date: Fri, 13 Mar 2020 14:25:01 +0900 (JST)
Subject: [ruby-changes:60378] 8562bfd150 (master): Move code to mark jit_unit's cc_entries to mjit.c

https://git.ruby-lang.org/ruby.git/commit/?id=8562bfd150

From 8562bfd1501a69aa736ba4f699a77940b2cdd9b1 Mon Sep 17 00:00:00 2001
From: Takashi Kokubun <takashikkbn@g...>
Date: Thu, 12 Mar 2020 22:21:31 -0700
Subject: Move code to mark jit_unit's cc_entries to mjit.c


diff --git a/iseq.c b/iseq.c
index d32a092..e1c18e7 100644
--- a/iseq.c
+++ b/iseq.c
@@ -359,17 +359,7 @@ rb_iseq_mark(const rb_iseq_t *iseq) https://github.com/ruby/ruby/blob/trunk/iseq.c#L359
 	}
 
 #if USE_MJIT
-        const struct rb_callcache **cc_entries;
-        if (body->jit_unit && (cc_entries = mjit_iseq_cc_entries(body)) != NULL) {
-            for (unsigned int i=0; i<body->ci_size; i++) {
-                const struct rb_callcache *cc = cc_entries[i];
-                if (cc != NULL) {
-                    // Pin `cc` and `cc->cme` against GC.compact as their addresses may be written in JIT-ed code.
-                    rb_gc_mark((VALUE)cc);
-                    rb_gc_mark((VALUE)vm_cc_cme(cc));
-                }
-            }
-        }
+        mjit_mark_cc_entries(body);
 #endif
     }
 
diff --git a/mjit.c b/mjit.c
index 514d04f..02a74a6 100644
--- a/mjit.c
+++ b/mjit.c
@@ -980,6 +980,7 @@ mjit_finish(bool close_handle_p) https://github.com/ruby/ruby/blob/trunk/mjit.c#L980
     verbose(1, "Successful MJIT finish");
 }
 
+// Called by rb_vm_mark() to mark iseq being JIT-ed and iseqs in the unit queue.
 void
 mjit_mark(void)
 {
@@ -1014,10 +1015,21 @@ mjit_mark(void) https://github.com/ruby/ruby/blob/trunk/mjit.c#L1015
     RUBY_MARK_LEAVE("mjit");
 }
 
-const struct rb_callcache **
-mjit_iseq_cc_entries(const struct rb_iseq_constant_body *const body)
+// Called by rb_iseq_mark() to mark cc_entries captured for MJIT
+void
+mjit_mark_cc_entries(const struct rb_iseq_constant_body *const body)
 {
-    return body->jit_unit->cc_entries;
+    const struct rb_callcache **cc_entries;
+    if (body->jit_unit && (cc_entries = body->jit_unit->cc_entries) != NULL) {
+        for (unsigned int i = 0; i < body->ci_size; i++) {
+            const struct rb_callcache *cc = cc_entries[i];
+            if (cc != NULL) {
+                // Pin `cc` and `cc->cme` against GC.compact as their addresses may be written in JIT-ed code.
+                rb_gc_mark((VALUE)cc);
+                rb_gc_mark((VALUE)vm_cc_cme(cc));
+            }
+        }
+    }
 }
 
 // A hook to update valid_class_serials.
diff --git a/mjit.h b/mjit.h
index 9a6af2f..dac0bcf 100644
--- a/mjit.h
+++ b/mjit.h
@@ -93,7 +93,7 @@ extern struct mjit_cont *mjit_cont_new(rb_execution_context_t *ec); https://github.com/ruby/ruby/blob/trunk/mjit.h#L93
 extern void mjit_cont_free(struct mjit_cont *cont);
 extern void mjit_add_class_serial(rb_serial_t class_serial);
 extern void mjit_remove_class_serial(rb_serial_t class_serial);
-const struct rb_callcache ** mjit_iseq_cc_entries(const struct rb_iseq_constant_body *const body);
+extern void mjit_mark_cc_entries(const struct rb_iseq_constant_body *const body);
 
 // A threshold used to reject long iseqs from JITting as such iseqs
 // takes too much time to be compiled.
-- 
cgit v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]