aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--internal.h4
-rw-r--r--mjit.c37
-rw-r--r--mjit.h2
-rw-r--r--process.c8
4 files changed, 35 insertions, 16 deletions
diff --git a/internal.h b/internal.h
index b505a47ace..17507e9992 100644
--- a/internal.h
+++ b/internal.h
@@ -1634,12 +1634,12 @@ VALUE rb_math_sqrt(VALUE);
extern int mjit_enabled;
VALUE mjit_pause(int wait_p);
VALUE mjit_resume(void);
-void mjit_finish(void);
+void mjit_clean_files(void);
#else
#define mjit_enabled 0
static inline VALUE mjit_pause(int wait_p){ return Qnil; } /* unreachable */
static inline VALUE mjit_resume(void){ return Qnil; } /* unreachable */
-static inline void mjit_finish(void){}
+static void mjit_clean_files(void){}
#endif
/* newline.c */
diff --git a/mjit.c b/mjit.c
index 5fa93a3cfa..f7ae80834f 100644
--- a/mjit.c
+++ b/mjit.c
@@ -785,6 +785,29 @@ mjit_child_after_fork(void)
start_worker();
}
+/* Half-baked version of mjit_finish(). It just deletes MJIT-related files.
+ Caller should disable MJIT because it won't work without the deleted files.
+
+ We want to use mjit_finish() for this function's usage but it's somehow broken like:
+ http://ci.rvm.jp/results/trunk-mjit-wait@silicon-docker/1480173 */
+void
+mjit_clean_files(void)
+{
+#ifndef _MSC_VER /* mswin has prebuilt precompiled header */
+ if (!mjit_opts.save_temps && getpid() == pch_owner_pid)
+ remove_file(pch_file);
+
+ xfree(header_file); header_file = NULL;
+#endif
+ xfree(tmp_dir); tmp_dir = NULL;
+ xfree(pch_file); pch_file = NULL;
+
+ mjit_call_p = FALSE;
+ free_list(&unit_queue);
+ free_list(&active_units);
+ free_list(&compact_units);
+}
+
/* Finish the threads processing units and creating PCH, finalize
and free MJIT data. It should be called last during MJIT
life. */
@@ -817,19 +840,7 @@ mjit_finish(void)
rb_native_cond_destroy(&mjit_worker_wakeup);
rb_native_cond_destroy(&mjit_gc_wakeup);
-#ifndef _MSC_VER /* mswin has prebuilt precompiled header */
- if (!mjit_opts.save_temps && getpid() == pch_owner_pid)
- remove_file(pch_file);
-
- xfree(header_file); header_file = NULL;
-#endif
- xfree(tmp_dir); tmp_dir = NULL;
- xfree(pch_file); pch_file = NULL;
-
- mjit_call_p = FALSE;
- free_list(&unit_queue);
- free_list(&active_units);
- free_list(&compact_units);
+ mjit_clean_files();
finish_conts();
mjit_enabled = FALSE;
diff --git a/mjit.h b/mjit.h
index d52196aee5..325fe555a7 100644
--- a/mjit.h
+++ b/mjit.h
@@ -66,6 +66,7 @@ RUBY_SYMBOL_EXPORT_END
extern int mjit_compile(FILE *f, const struct rb_iseq_constant_body *body, const char *funcname, struct rb_call_cache *cc_entries, union iseq_inline_storage_entry *is_entries);
extern void mjit_init(struct mjit_options *opts);
+extern void mjit_finish(void);
extern void mjit_gc_start_hook(void);
extern void mjit_gc_finish_hook(void);
extern void mjit_free_iseq(const rb_iseq_t *iseq);
@@ -131,6 +132,7 @@ void mjit_child_after_fork(void);
#else /* USE_MJIT */
static inline struct mjit_cont *mjit_cont_new(rb_execution_context_t *ec){return NULL;}
static inline void mjit_cont_free(struct mjit_cont *cont){}
+static inline void mjit_finish(void){}
static inline void mjit_gc_start_hook(void){}
static inline void mjit_gc_finish_hook(void){}
static inline void mjit_free_iseq(const rb_iseq_t *iseq){}
diff --git a/process.c b/process.c
index 29d8ae6fa4..395649e757 100644
--- a/process.c
+++ b/process.c
@@ -2944,7 +2944,13 @@ rb_f_exec(int argc, const VALUE *argv)
execarg_obj = rb_execarg_new(argc, argv, TRUE, FALSE);
eargp = rb_execarg_get(execarg_obj);
- if (mjit_enabled) mjit_finish(); /* do not leave files or leak children */
+ if (mjit_enabled) {
+ /* TODO: Use mjit_finish() here. We're not doing so because it leads SEGV
+ http://ci.rvm.jp/results/trunk-mjit-wait@silicon-docker/1480173 and we don't know why. */
+ mjit_pause(FALSE); /* do not leak children */
+ mjit_clean_files(); /* do not leave files. */
+ mjit_enabled = FALSE; /* MJIT won't work without files deleted above. never JIT-able after exec failure + rescue, for now. */
+ }
before_exec(); /* stop timer thread before redirects */
rb_execarg_parent_start(execarg_obj);
fail_str = eargp->use_shell ? eargp->invoke.sh.shell_script : eargp->invoke.cmd.command_name;