@@ -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 } ; -*-
359362BEGIN {
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 }
364367eom
@@ -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