mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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
This commit is contained in:
parent
6cd5db8904
commit
c91c62b674
2 changed files with 16 additions and 2 deletions
16
mjit.c
16
mjit.c
|
@ -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");
|
||||
|
|
2
mjit.h
2
mjit.h
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue