From: mame@...
Date: 2018-06-21T09:21:50+00:00
Subject: [ruby-core:87563] [Ruby trunk Feature#14830][Assigned] RubyVM::MJIT.pause / RubyVM::MJIT.resume

Issue #14830 has been updated by mame (Yusuke Endoh).

Status changed from Open to Assigned

We discussed this ticket at the developers' meeting.  There is no objection (because RubyVM is just for internal features), and matz approved.  Please go ahead.

One point: Using MJIT.pause to "maintain Ruby's test cases that expect there is no child process with --jit", may indicate another issue.  For example, `waitpid(-1)` waits for any child process.  If `waitpid(-1)` detects termination of gcc process, it is not an expected behavior.  If the test in question checks this kind of issues, "fixing" it by using MJIT.pause does not solve the issue itself.

----------------------------------------
Feature #14830: RubyVM::MJIT.pause / RubyVM::MJIT.resume
https://bugs.ruby-lang.org/issues/14830#change-72569

* Author: k0kubun (Takashi Kokubun)
* Status: Assigned
* Priority: Normal
* Assignee: k0kubun (Takashi Kokubun)
* Target version: 2.6
----------------------------------------
This ticket is picking only MJIT.pause from https://bugs.ruby-lang.org/issues/14491 and adding MJIT.resume.

# Purpose
* When benchmarking JIT-ed code, I want to get rid of bad impact for performance that comes from ongoing JIT compilation, without waiting for all JIT compilation finish.
* To make it easy to maintain Ruby's test cases that expect there is no child process with --jit. Using --jit makes them fail by existence of gcc or clang process, and I don't want to wait all JIT compilation finish to make it pass.

# Proposals

~~~ ruby
# Pause MJIT compilations but keep JIT-ed code available
RubyVM::MJIT.pause

# Start MJIT compilations again after the MJIT.pause
RubyVM::MJIT.resume
~~~

# Details
## RubyVM::MJIT.pause
* When MJIT is disabled (without --jit), it raises RuntimeError: "MJIT is not enabled".
* When MJIT is enabled,
  * and when MJIT is paused, it does nothing and returns false.
  * and when MJIT is running, it blocks to wait for current JIT finish, pauses MJIT worker and returns true.

## RubyVM::MJIT.resume
* When MJIT is disabled (without --jit), it raises RuntimeError: "MJIT is not enabled".
* When MJIT is enabled,
  * and when MJIT is paused, it starts MJIT worker and returns true. It raises RuntimeError if it fails to resume (very rare).
  * and when MJIT is running, it does nothing and returns false.



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>