Project

General

Profile

Actions

Feature #14830

closed

RubyVM::MJIT.pause / RubyVM::MJIT.resume

Added by k0kubun (Takashi Kokubun) over 6 years ago. Updated over 6 years ago.

Status:
Closed
Target version:
[ruby-core:87428]

Description

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

# 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.

Related issues 3 (0 open3 closed)

Related to Ruby master - Bug #14867: Process.wait can wait for MJIT compiler processClosednormalperson (Eric Wong)Actions
Related to Ruby master - Feature #14954: Add :wait option to RubyVM::MJIT.pauseClosedActions
Follows Ruby master - Feature #14491: MJIT needs internal debugging methodsClosedk0kubun (Takashi Kokubun)Actions

Updated by k0kubun (Takashi Kokubun) over 6 years ago

I already created a patch for this https://github.com/ruby/ruby/pull/1882. Please check it out if you're interested in the details.

Actions #2

Updated by k0kubun (Takashi Kokubun) over 6 years ago

Updated by mame (Yusuke Endoh) over 6 years ago

  • 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.

Actions #4

Updated by k0kubun (Takashi Kokubun) over 6 years ago

  • Status changed from Assigned to Closed

Applied in changeset trunk|r63710.


mjit.c: RubyVM::MJIT.pause / RubyVM::MJIT.resume

[Feature #14830]

Updated by k0kubun (Takashi Kokubun) over 6 years ago

If the test in question checks this kind of issues, "fixing" it by using MJIT.pause does not solve the issue itself.

That makes sense. I had thought it's a kind of limitation with MJIT, but I rethought that we should have some special fix for waitpid(-1) and related things, considering the real usage. So I'll forget the second purpose, just skip the test for now and really fix it later. I committed this feature for the first purpose anyway.

Actions #6

Updated by k0kubun (Takashi Kokubun) over 6 years ago

  • Related to Bug #14867: Process.wait can wait for MJIT compiler process added
Actions #7

Updated by k0kubun (Takashi Kokubun) over 6 years ago

  • Related to Feature #14954: Add :wait option to RubyVM::MJIT.pause added
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0