[前][次][番号順一覧][スレッド一覧]

ruby-changes:53776

From: k0kubun <ko1@a...>
Date: Mon, 26 Nov 2018 22:40:01 +0900 (JST)
Subject: [ruby-changes:53776] k0kubun:r65994 (trunk): process.c: finish MJIT prior to #exec

k0kubun	2018-11-26 22:39:53 +0900 (Mon, 26 Nov 2018)

  New Revision: 65994

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=65994

  Log:
    process.c: finish MJIT prior to #exec
    
    to prevent ruby from leaving MJIT-related files.
    
    test_jit.rb: add a test to prevent that

  Modified files:
    trunk/internal.h
    trunk/mjit.h
    trunk/process.c
    trunk/test/ruby/test_jit.rb
Index: mjit.h
===================================================================
--- mjit.h	(revision 65993)
+++ mjit.h	(revision 65994)
@@ -66,7 +66,6 @@ RUBY_SYMBOL_EXPORT_END https://github.com/ruby/ruby/blob/trunk/mjit.h#L66
 
 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);
@@ -132,7 +131,6 @@ void mjit_child_after_fork(void); https://github.com/ruby/ruby/blob/trunk/mjit.h#L131
 #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){}
Index: process.c
===================================================================
--- process.c	(revision 65993)
+++ process.c	(revision 65994)
@@ -2944,7 +2944,7 @@ rb_f_exec(int argc, const VALUE *argv) https://github.com/ruby/ruby/blob/trunk/process.c#L2944
 
     execarg_obj = rb_execarg_new(argc, argv, TRUE, FALSE);
     eargp = rb_execarg_get(execarg_obj);
-    if (mjit_enabled) mjit_pause(FALSE); /* do not leak children */
+    if (mjit_enabled) mjit_finish(); /* do not leave files or leak children */
     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;
Index: internal.h
===================================================================
--- internal.h	(revision 65993)
+++ internal.h	(revision 65994)
@@ -1634,10 +1634,12 @@ VALUE rb_math_sqrt(VALUE); https://github.com/ruby/ruby/blob/trunk/internal.h#L1634
 extern int mjit_enabled;
 VALUE mjit_pause(int wait_p);
 VALUE mjit_resume(void);
+void mjit_finish(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){}
 #endif
 
 /* newline.c */
Index: test/ruby/test_jit.rb
===================================================================
--- test/ruby/test_jit.rb	(revision 65993)
+++ test/ruby/test_jit.rb	(revision 65994)
@@ -776,6 +776,18 @@ class TestJIT < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_jit.rb#L776
     end
   end
 
+  def test_clean_objects_on_exec
+    Dir.mktmpdir("jit_test_clean_objects_on_exec_") do |dir|
+      eval_with_jit({"TMPDIR"=>dir}, "#{<<~"begin;"}\n#{<<~"end;"}", min_calls: 1)
+      begin;
+        def a; end; a
+        exec "true"
+      end;
+      error_message = "Undeleted files:\n  #{Dir.glob("#{dir}/*").join("\n  ")}\n"
+      assert_send([Dir, :empty?, dir], error_message)
+    end
+  end if system("which true")
+
   def test_lambda_longjmp
     assert_eval_with_jit("#{<<~"begin;"}\n#{<<~"end;"}", stdout: '5', success_count: 1)
     begin;

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]