summaryrefslogtreecommitdiff
path: root/mjit_worker.c
diff options
context:
space:
mode:
authork0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-08-11 14:18:55 +0000
committerk0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-08-11 14:18:55 +0000
commit004b8ad0c349070fdea552dcab0fb21c04dbc105 (patch)
tree71fc219aa66504c2ccf1db4bd36e16f51a2f47f8 /mjit_worker.c
parent591b2566d71a9c6106333fffd019cab4f64cf816 (diff)
mjit_worker.c: don't use ruby_strdup
on MJIT worker. That may trigger GC. And handled strdup failure instead. mjit_compile.c: update comment about GC git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64301 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'mjit_worker.c')
-rw-r--r--mjit_worker.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/mjit_worker.c b/mjit_worker.c
index 3f2eb2d181..ff666c800e 100644
--- a/mjit_worker.c
+++ b/mjit_worker.c
@@ -8,7 +8,7 @@
/* NOTE: All functions in this file are executed on MJIT worker. So don't
call Ruby methods (C functions that may call rb_funcall) or trigger
- GC (using xmalloc, ZALLOC, etc.) in this file. */
+ GC (using ZALLOC, xmalloc, xfree, etc.) in this file. */
/* We utilize widely used C compilers (GCC and LLVM Clang) to
implement MJIT. We feed them a C code generated from ISEQ. The
@@ -78,7 +78,6 @@
#include "gc.h"
#include "ruby_assert.h"
#include "ruby/thread.h"
-#include "ruby/util.h"
#ifdef _WIN32
#include <winsock2.h>
@@ -95,9 +94,11 @@
#ifdef HAVE_SYS_PARAM_H
# include <sys/param.h>
#endif
-
#include "dln.h"
+#include "ruby/util.h"
+#undef strdup /* ruby_strdup may trigger GC */
+
#ifndef MAXPATHLEN
# define MAXPATHLEN 1024
#endif
@@ -885,6 +886,8 @@ compact_all_jit_code(void)
if (!mjit_opts.save_temps) {
# ifdef _WIN32
unit->so_file = strdup(so_file); /* lazily delete on `clean_object_files()` */
+ if (unit->so_file == NULL)
+ mjit_warning("failed to allocate memory to lazily remove '%s': %s", so_file, strerror(errno));
# else
remove_file(so_file);
# endif
@@ -1085,6 +1088,10 @@ convert_unit_to_func(struct rb_mjit_unit *unit)
/* Alwasy set o_file for compaction. The value is also used for lazy deletion. */
unit->o_file = strdup(o_file);
+ if (unit->o_file == NULL) {
+ mjit_warning("failed to allocate memory to remember '%s' (%s), removing it...", o_file, strerror(errno));
+ remove_file(o_file);
+ }
}
#endif
end_time = real_ms_time();
@@ -1100,6 +1107,8 @@ convert_unit_to_func(struct rb_mjit_unit *unit)
if (!mjit_opts.save_temps) {
#ifdef _WIN32
unit->so_file = strdup(so_file); /* lazily delete on `clean_object_files()` */
+ if (unit->so_file == NULL)
+ mjit_warning("failed to allocate memory to lazily remove '%s': %s", so_file, strerror(errno));
#else
remove_file(so_file);
#endif