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

ruby-changes:50626

From: k0kubun <ko1@a...>
Date: Sat, 17 Mar 2018 11:00:35 +0900 (JST)
Subject: [ruby-changes:50626] k0kubun:r62785 (trunk): mjit.c: add timeout for --jit-wait

k0kubun	2018-03-17 11:00:30 +0900 (Sat, 17 Mar 2018)

  New Revision: 62785

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

  Log:
    mjit.c: add timeout for --jit-wait
    
    Sometimes test hangs in `mjit_get_iseq_func` like this:
    http://ci.rvm.jp/results/trunk-test@ruby-sky3/659391
    
    It seems that a process waiting in `mjit_get_iseq_func` does no longer
    have MJIT worker thread. We don't wait for JIT finish forever. So I
    added timeout for the case. I'm not sure why there was no MJIT worker
    thread in ruby-sky3 test process though.

  Modified files:
    trunk/mjit.c
    trunk/mjit.h
Index: mjit.c
===================================================================
--- mjit.c	(revision 62784)
+++ mjit.c	(revision 62785)
@@ -1125,15 +1125,29 @@ mjit_add_iseq_to_process(const rb_iseq_t https://github.com/ruby/ruby/blob/trunk/mjit.c#L1125
     CRITICAL_SECTION_FINISH(3, "in add_iseq_to_process");
 }
 
+/* For this timeout seconds, --jit-wait will wait for JIT compilation finish. */
+#define MJIT_WAIT_TIMEOUT_SECONDS 60
+
 /* Wait for JIT compilation finish for --jit-wait. This should only return a function pointer
    or NOT_COMPILABLE_JIT_ISEQ_FUNC. */
 mjit_func_t
-mjit_get_iseq_func(const struct rb_iseq_constant_body *body)
+mjit_get_iseq_func(struct rb_iseq_constant_body *body)
 {
     struct timeval tv;
+    int tries = 0;
     tv.tv_sec = 0;
     tv.tv_usec = 1000;
     while (body->jit_func == (mjit_func_t)NOT_READY_JIT_ISEQ_FUNC) {
+        tries++;
+        if (tries / 1000 > MJIT_WAIT_TIMEOUT_SECONDS) {
+            CRITICAL_SECTION_START(3, "in mjit_get_iseq_func to set jit_func");
+            body->jit_func = (mjit_func_t)NOT_COMPILABLE_JIT_ISEQ_FUNC; /* JIT worker seems dead. Give up. */
+            CRITICAL_SECTION_FINISH(3, "in mjit_get_iseq_func to set jit_func");
+            if (mjit_opts.warnings || mjit_opts.verbose)
+                fprintf(stderr, "MJIT warning: timed out to wait for JIT finish\n");
+            break;
+        }
+
         CRITICAL_SECTION_START(3, "in mjit_get_iseq_func for a client wakeup");
         rb_native_cond_broadcast(&mjit_worker_wakeup);
         CRITICAL_SECTION_FINISH(3, "in mjit_get_iseq_func for a client wakeup");
Index: mjit.h
===================================================================
--- mjit.h	(revision 62784)
+++ mjit.h	(revision 62785)
@@ -56,7 +56,7 @@ extern struct mjit_options mjit_opts; https://github.com/ruby/ruby/blob/trunk/mjit.h#L56
 extern int mjit_init_p;
 
 extern void mjit_add_iseq_to_process(const rb_iseq_t *iseq);
-extern mjit_func_t mjit_get_iseq_func(const struct rb_iseq_constant_body *body);
+extern mjit_func_t mjit_get_iseq_func(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);

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

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