summaryrefslogtreecommitdiff
path: root/mjit.c
diff options
context:
space:
mode:
authork0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-10-07 04:17:59 +0000
committerk0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-10-07 04:17:59 +0000
commite889fad86c848a15897e246d92a1b8a8d7baaeb5 (patch)
tree829b60da286751ccf0b8560cee81b6f237722a27 /mjit.c
parentb50955fdb8a0be9ef896c239d12c77995a54e51d (diff)
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 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64929 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'mjit.c')
-rw-r--r--mjit.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/mjit.c b/mjit.c
index beb59d9646..56e7bb6792 100644
--- a/mjit.c
+++ b/mjit.c
@@ -306,8 +306,8 @@ mjit_add_iseq_to_process(const rb_iseq_t *iseq)
/* 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_constant_body *body)
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;