diff options
author | k0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-03-17 02:00:30 +0000 |
---|---|---|
committer | k0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-03-17 02:00:30 +0000 |
commit | c91c62b674736fd807a201b4314a48f854f1c2c0 (patch) | |
tree | a514ffb661c5ae2767c4df6c73e69ab729fbe942 | |
parent | 6cd5db8904379eeb3f80998814e028b6f1adc6a8 (diff) | |
download | ruby-c91c62b674736fd807a201b4314a48f854f1c2c0.tar.gz |
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.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62785 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | mjit.c | 16 | ||||
-rw-r--r-- | mjit.h | 2 |
2 files changed, 16 insertions, 2 deletions
@@ -1125,15 +1125,29 @@ mjit_add_iseq_to_process(const rb_iseq_t *iseq) 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"); @@ -56,7 +56,7 @@ extern struct mjit_options mjit_opts; 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); |