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

ruby-changes:52717

From: k0kubun <ko1@a...>
Date: Sun, 7 Oct 2018 13:18:04 +0900 (JST)
Subject: [ruby-changes:52717] k0kubun:r64929 (trunk): mjit.h: call compiled code immediately

k0kubun	2018-10-07 13:17:59 +0900 (Sun, 07 Oct 2018)

  New Revision: 64929

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=64929

  Log:
    mjit.h: call compiled code immediately
    
    after the first compilation on --jit-wait.
    
    Previously the assignment to `func` didn't have meaning for the behavior,
    and the compiled code wasn't called immediately after the synchronous
    compilation. It wasn't intentional.
    
    Fixing this issue without impacting performance without --jit-wait is
    not so obvious. Adding branch or goto to call func in mjit_exec spoiled
    the performance without --jit-wait. Instead of that, I called the func
    inside mjit_wait_call() (former mjit_get_iseq_func()) which is never
    inlined to mjit_exec(). Thanks to that, this commit has no impact for
    normal performance.
    
    mjit.c: ditto

  Modified files:
    trunk/mjit.c
    trunk/mjit.h
Index: mjit.c
===================================================================
--- mjit.c	(revision 64928)
+++ mjit.c	(revision 64929)
@@ -306,8 +306,8 @@ mjit_add_iseq_to_process(const rb_iseq_t https://github.com/ruby/ruby/blob/trunk/mjit.c#L306
 
 /* Wait for JIT compilation finish for --jit-wait. This should only return a function pointer
    or NOT_COMPILED_JIT_ISEQ_FUNC. */
-mjit_func_t
-mjit_get_iseq_func(struct rb_iseq_constant_body *body)
+VALUE
+mjit_wait_call(rb_execution_context_t *ec, struct rb_iseq_constant_body *body)
 {
     struct timeval tv;
     int tries = 0;
@@ -316,19 +316,23 @@ mjit_get_iseq_func(struct rb_iseq_consta https://github.com/ruby/ruby/blob/trunk/mjit.c#L316
     while (body->jit_func == (mjit_func_t)NOT_READY_JIT_ISEQ_FUNC) {
         tries++;
         if (tries / 1000 > MJIT_WAIT_TIMEOUT_SECONDS || pch_status == PCH_FAILED) {
-            CRITICAL_SECTION_START(3, "in mjit_get_iseq_func to set jit_func");
+            CRITICAL_SECTION_START(3, "in mjit_wait_call to set jit_func");
             body->jit_func = (mjit_func_t)NOT_COMPILED_JIT_ISEQ_FUNC; /* JIT worker seems dead. Give up. */
-            CRITICAL_SECTION_FINISH(3, "in mjit_get_iseq_func to set jit_func");
+            CRITICAL_SECTION_FINISH(3, "in mjit_wait_call to set jit_func");
             mjit_warning("timed out to wait for JIT finish");
             break;
         }
 
-        CRITICAL_SECTION_START(3, "in mjit_get_iseq_func for a client wakeup");
+        CRITICAL_SECTION_START(3, "in mjit_wait_call for a client wakeup");
         rb_native_cond_broadcast(&mjit_worker_wakeup);
-        CRITICAL_SECTION_FINISH(3, "in mjit_get_iseq_func for a client wakeup");
+        CRITICAL_SECTION_FINISH(3, "in mjit_wait_call for a client wakeup");
         rb_thread_wait_for(tv);
     }
-    return body->jit_func;
+
+    if ((uintptr_t)body->jit_func <= (uintptr_t)LAST_JIT_ISEQ_FUNC) {
+        return Qundef;
+    }
+    return body->jit_func(ec, ec->cfp);
 }
 
 extern VALUE ruby_archlibdir_path, ruby_prefix_path;
Index: mjit.h
===================================================================
--- mjit.h	(revision 64928)
+++ mjit.h	(revision 64929)
@@ -59,7 +59,7 @@ RUBY_EXTERN struct mjit_options mjit_opt https://github.com/ruby/ruby/blob/trunk/mjit.h#L59
 RUBY_EXTERN int mjit_call_p;
 
 extern void mjit_add_iseq_to_process(const rb_iseq_t *iseq);
-extern mjit_func_t mjit_get_iseq_func(struct rb_iseq_constant_body *body);
+extern VALUE mjit_wait_call(rb_execution_context_t *ec, struct rb_iseq_constant_body *body);
 RUBY_SYMBOL_EXPORT_END
 
 extern int mjit_compile(FILE *f, const struct rb_iseq_constant_body *body, const char *funcname);
@@ -110,7 +110,7 @@ mjit_exec(rb_execution_context_t *ec) https://github.com/ruby/ruby/blob/trunk/mjit.h#L110
             if (total_calls == mjit_opts.min_calls && mjit_target_iseq_p(body)) {
                 mjit_add_iseq_to_process(iseq);
                 if (UNLIKELY(mjit_opts.wait)) {
-                    func = mjit_get_iseq_func(body);
+                    return mjit_wait_call(ec, body);
                 }
             }
             return Qundef;

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

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