@@ -1688,12 +1688,10 @@ def _run_suite suite, type
16881688 trace = true
16891689 end
16901690
1691- run_tests_in_ractors = ENV [ "RUBY_TESTS_WITH_RACTORS" ]
1692-
1691+ run_tests_inside_ractors_num = ENV [ "RUBY_TESTS_WITH_RACTORS" ] . to_i
16931692 tests_run = 0
16941693 assertions = all_test_methods . map { |method |
1695-
1696- inst = suite . new method
1694+ inst = suite . new method . to_s
16971695 _start_method ( inst )
16981696 inst . _assertions = 0
16991697
@@ -1704,34 +1702,62 @@ def _run_suite suite, type
17041702 if trace
17051703 ObjectSpace . trace_object_allocations { inst . run self }
17061704 else
1707- if run_tests_in_ractors
1708- port = Ractor ::Port . new
1709- r = Ractor . new ( port ) do |p |
1710- instance = Ractor . receive
1711- runner = Ractor . receive
1712- res = instance . run runner
1713- movable_ivars = { :@_assertions => true , :@__passed__ => true , :@__name__ => true }
1714- instance . instance_variables . each do |ivar |
1715- unless movable_ivars [ ivar ]
1716- instance . remove_instance_variable ( ivar )
1705+ if run_tests_inside_ractors_num > 0
1706+ old_report = self . report
1707+ old_failures = self . failures
1708+ old_errors = self . errors
1709+ old_skips = self . skips
1710+ old_assertion_count = self . assertion_count
1711+ old_test_count = self . test_count
1712+ self . report = [ ]
1713+ self . failures = 0
1714+ self . errors = 0
1715+ self . skips = 0
1716+ self . assertion_count = 0
1717+ self . test_count = 0
1718+ rs = run_tests_inside_ractors_num . times . map do
1719+ r = Ractor . new ( inst , self ) do |instance , runner |
1720+ res = instance . run runner
1721+ testcase_copyable_ivars = { :@_assertions => true , :@__passed__ => true , :@__name__ => true }
1722+ runner_copyable_ivars = { :@report => true , :@failures => true , :@errors => true , :@skips => true , :@assertion_count => true , :@test_count => true }
1723+ instance . instance_variables . each do |ivar |
1724+ unless testcase_copyable_ivars [ ivar ]
1725+ instance . remove_instance_variable ( ivar )
1726+ end
17171727 end
1728+ runner . instance_variables . each do |ivar |
1729+ unless runner_copyable_ivars [ ivar ]
1730+ runner . remove_instance_variable ( ivar )
1731+ end
1732+ end
1733+ [ instance , runner , res ]
17181734 end
1719- p . send ( instance , move : true )
1720- p . send ( runner )
1721- res
17221735 end
1723- r . send ( inst , move : true )
1724- r . send ( self , move : false )
1725- inst = port . receive
1726- runner = port . receive
1727- result = r . value
1728- _merge_results_from_ractor ( runner )
1729- port . close
1730- result
1736+ ractor_results = [ ]
1737+ while rs . any?
1738+ r , obj = Ractor . select ( *rs )
1739+ _inst , runner , res = *obj
1740+ ractor_results << [ res , runner ]
1741+ rs . delete ( r )
1742+ end
1743+ # ractors done
1744+ self . report = old_report
1745+ self . failures = old_failures
1746+ self . errors = old_errors
1747+ self . skips = old_skips
1748+ self . assertion_count = old_assertion_count
1749+ self . test_count = old_test_count
1750+ res = ""
1751+ ractor_results . each do |( res0 , runner ) |
1752+ res += res0
1753+ _merge_results_from_ractor ( runner )
1754+ end
1755+ res
17311756 else
17321757 inst . run self
17331758 end
17341759 end
1760+
17351761 tests_run += 1
17361762
17371763 print "%.2f s = " % ( Time . now - start_time ) if @verbose
@@ -1747,13 +1773,16 @@ def _run_suite suite, type
17471773 return assertions . size , assertions . inject ( 0 ) { |sum , n | sum + n }
17481774 end
17491775
1776+ def __init_runner ( runner )
1777+ end
1778+
17501779 def _merge_results_from_ractor ( runner_cpy )
1751- @report = runner_cpy . report
1752- @failures = runner_cpy . failures
1753- @errors = runner_cpy . errors
1754- @skips = runner_cpy . skips
1755- @assertion_count = runner_cpy . assertion_count
1756- @test_count = runner_cpy . test_count
1780+ @report + = runner_cpy . report
1781+ @failures + = runner_cpy . failures
1782+ @errors + = runner_cpy . errors
1783+ @skips + = runner_cpy . skips
1784+ @assertion_count + = runner_cpy . assertion_count
1785+ @test_count + = runner_cpy . test_count
17571786 end
17581787
17591788 def _start_method ( inst )
0 commit comments