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");
|
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
|
/* Wait for JIT compilation finish for --jit-wait. This should only return a function pointer
|
||||||
or NOT_COMPILABLE_JIT_ISEQ_FUNC. */
|
or NOT_COMPILABLE_JIT_ISEQ_FUNC. */
|
||||||
mjit_func_t
|
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;
|
struct timeval tv;
|
||||||
|
int tries = 0;
|
||||||
tv.tv_sec = 0;
|
tv.tv_sec = 0;
|
||||||
tv.tv_usec = 1000;
|
tv.tv_usec = 1000;
|
||||||
while (body->jit_func == (mjit_func_t)NOT_READY_JIT_ISEQ_FUNC) {
|
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");
|
CRITICAL_SECTION_START(3, "in mjit_get_iseq_func for a client wakeup");
|
||||||
rb_native_cond_broadcast(&mjit_worker_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_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 int mjit_init_p;
|
||||||
|
|
||||||
extern void mjit_add_iseq_to_process(const rb_iseq_t *iseq);
|
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
|
RUBY_SYMBOL_EXPORT_END
|
||||||
|
|
||||||
extern int mjit_compile(FILE *f, const struct rb_iseq_constant_body *body, const char *funcname);
|
extern int mjit_compile(FILE *f, const struct rb_iseq_constant_body *body, const char *funcname);
|
||||||
|
|
Loading…
Add table
Reference in a new issue