Skip to content

Commit 3475b38

Browse files
committed
Differentiate the token by the separated runner process
1 parent 2dba041 commit 3475b38

File tree

1 file changed

+15
-7
lines changed

1 file changed

+15
-7
lines changed

tool/lib/core_assertions.rb

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ def assert_no_memory_leak(args, prepare, code, message=nil, limit: 2.0, rss: fal
176176
require_relative 'memory_status'
177177
raise Test::Unit::PendedError, "unsupported platform" unless defined?(Memory::Status)
178178

179-
token_dump, token_re = new_test_token
179+
token = new_test_token
180180
envs = args.shift if Array === args and Hash === args.first
181181
args = [
182182
"--disable=gems",
@@ -191,14 +191,16 @@ def assert_no_memory_leak(args, prepare, code, message=nil, limit: 2.0, rss: fal
191191
end
192192
args.unshift(envs) if envs
193193
cmd = [
194-
'END {STDERR.puts '"#{token_dump}"'"FINAL=#{Memory::Status.new}"}',
194+
'_memory_leak_report_token = '"#{token_dump}"'.sub("<PID>", $$.to_s)',
195+
'END {STDERR.puts "#{_memory_leak_report_token}FINAL=#{Memory::Status.new}"}',
195196
prepare,
196-
'STDERR.puts('"#{token_dump}"'"START=#{$initial_status = Memory::Status.new}")',
197+
'STDERR.puts("#{_memory_leak_report_token}START=#{$initial_status = Memory::Status.new}")',
197198
'$initial_size = $initial_status.size',
198199
code,
199200
'GC.start',
200201
].join("\n")
201202
_, err, status = EnvUtil.invoke_ruby(args, cmd, true, true, **opt)
203+
token_re = Regexp.quote(token_for_pid(token, status.pid))
202204
before = err.sub!(/^#{token_re}START=(\{.*\})\n/, '') && Memory::Status.parse($1)
203205
after = err.sub!(/^#{token_re}FINAL=(\{.*\})\n/, '') && Memory::Status.parse($1)
204206
assert(status.success?, FailDesc[status, message, err])
@@ -325,6 +327,7 @@ def separated_runner(token, out = nil)
325327
# assume Method#call and UnboundMethod#bind_call need to work as the original
326328

327329
at_exit {
330+
token = token_for_pid(token, Process.pid)
328331
assertions = assertions_ivar_get.call(:@_assertions)
329332
out_write.call <<~OUT
330333
#{token}<error>
@@ -353,12 +356,12 @@ def assert_separately(args, file = nil, line = nil, src, ignore_stderr: nil, **o
353356
res_p, res_c = IO.pipe
354357
opt[:ios] = [res_c]
355358
end
356-
token_dump, token_re = new_test_token
359+
token = new_test_token
357360
src = <<eom
358361
# -*- coding: #{line += __LINE__; src.encoding}; -*-
359362
BEGIN {
360363
require "test/unit";include Test::Unit::Assertions;require #{__FILE__.dump};include Test::Unit::CoreAssertions
361-
separated_runner #{token_dump}, #{res_c&.fileno || 'nil'}
364+
separated_runner #{token.dump}, #{res_c&.fileno || 'nil'}
362365
}
363366
#{line -= __LINE__; src}
364367
eom
@@ -368,6 +371,7 @@ def assert_separately(args, file = nil, line = nil, src, ignore_stderr: nil, **o
368371
# power_assert 3 requires ruby 3.1 or later
369372
args << "-W:no-experimental" if RUBY_VERSION < "3.1."
370373
stdout, stderr, status = EnvUtil.invoke_ruby(args, src, capture_stdout, true, **opt)
374+
token_re = Regexp.quote(token_for_pid(token, status.pid))
371375

372376
if sanitizers&.lsan_enabled?
373377
# LSAN may output messages like the following line into stderr. We should ignore it.
@@ -953,8 +957,12 @@ def diff(exp, act)
953957
end
954958

955959
def new_test_token
956-
token = "\e[7;1m#{$$.to_s}:#{Time.now.strftime('%s.%L')}:#{rand(0x10000).to_s(16)}:\e[m"
957-
return token.dump, Regexp.quote(token)
960+
token = "\e[7;1m<PID>:#{Time.now.strftime('%s.%L')}:#{rand(0x10000).to_s(16)}:\e[m"
961+
return token
962+
end
963+
964+
def token_for_pid(token, pid)
965+
token.sub("<PID>", pid.to_s)
958966
end
959967

960968
# Platform predicates

0 commit comments

Comments
 (0)