From 0fe47fad55e15e890b7b45ffeaba47828760100d Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 3 Feb 2017 12:52:09 +0000 Subject: [PATCH] test/unit.rb: share job slots * test/lib/test/unit.rb (Test::Unit::Parallel#_run_parallel): share job slots with GNU 'make'. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57514 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- common.mk | 12 +++++++----- defs/gmake.mk | 1 + test/lib/test/unit.rb | 33 ++++++++++++++++++++++++++++++++- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/common.mk b/common.mk index eee5886dd5..5b654ded88 100644 --- a/common.mk +++ b/common.mk @@ -11,6 +11,8 @@ Q = $(Q1:0=@) ECHO0 = $(ECHO1:0=echo) ECHO = @$(ECHO0) +gnumake_recursive = + UNICODE_VERSION = 9.0.0 ### set the following environment variable or uncomment the line if @@ -624,7 +626,7 @@ yes-test-knownbug: prog PHONY test-testframework: $(TEST_RUNNABLE)-test-testframework yes-test-testframework: prog PHONY - $(Q)$(exec) $(RUNRUBY) "$(srcdir)/test/runner.rb" --ruby="$(RUNRUBY)" $(TESTOPTS) testunit minitest + $(gnumake_recursive)$(Q)$(exec) $(RUNRUBY) "$(srcdir)/test/runner.rb" --ruby="$(RUNRUBY)" $(TESTOPTS) testunit minitest no-test-testframework: PHONY test-sample: test-basic # backward compatibility for mswin-build @@ -634,20 +636,20 @@ test: btest-ruby test-knownbug test-basic # for example, make test-all TESTOPTS="-j2 -v -n test-name -- test-file-name" test-all: $(TEST_RUNNABLE)-test-all yes-test-all: prog PHONY - $(Q)$(exec) $(RUNRUBY) "$(srcdir)/test/runner.rb" --ruby="$(RUNRUBY)" $(TEST_EXCLUDES) $(TESTOPTS) $(TESTS) + $(gnumake_recursive)$(Q)$(exec) $(RUNRUBY) "$(srcdir)/test/runner.rb" --ruby="$(RUNRUBY)" $(TEST_EXCLUDES) $(TESTOPTS) $(TESTS) TESTS_BUILD = mkmf no-test-all: PHONY - $(MINIRUBY) -I"$(srcdir)/lib" "$(srcdir)/test/runner.rb" $(TESTOPTS) $(TESTS_BUILD) + $(gnumake_recursive)$(MINIRUBY) -I"$(srcdir)/lib" "$(srcdir)/test/runner.rb" $(TESTOPTS) $(TESTS_BUILD) test-almost: $(TEST_RUNNABLE)-test-almost yes-test-almost: prog PHONY - $(Q)$(exec) $(RUNRUBY) "$(srcdir)/test/runner.rb" --ruby="$(RUNRUBY)" $(TEST_EXCLUDES) $(TESTOPTS) $(EXCLUDE_TESTFRAMEWORK) $(TESTS) + $(gnumake_recursive)$(Q)$(exec) $(RUNRUBY) "$(srcdir)/test/runner.rb" --ruby="$(RUNRUBY)" $(TEST_EXCLUDES) $(TESTOPTS) $(EXCLUDE_TESTFRAMEWORK) $(TESTS) no-test-almost: PHONY test-ruby: $(TEST_RUNNABLE)-test-ruby no-test-ruby: PHONY yes-test-ruby: prog encs PHONY - $(RUNRUBY) "$(srcdir)/test/runner.rb" $(TEST_EXCLUDES) $(TESTOPTS) -- ruby -ext- + $(gnumake_recursive)$(RUNRUBY) "$(srcdir)/test/runner.rb" $(TEST_EXCLUDES) $(TESTOPTS) -- ruby -ext- extconf: $(PREP) $(Q) $(MAKEDIRS) "$(EXTCONFDIR)" diff --git a/defs/gmake.mk b/defs/gmake.mk index 2233627f8c..3f2bba4d05 100644 --- a/defs/gmake.mk +++ b/defs/gmake.mk @@ -1,5 +1,6 @@ # -*- makefile-gmake -*- gnumake = yes +override gnumake_recursive := + CHECK_TARGETS := exam love check% TEST_TARGETS := $(filter check test check% test% btest%,$(MAKECMDGOALS)) diff --git a/test/lib/test/unit.rb b/test/lib/test/unit.rb index ad7620313d..2be96fe600 100644 --- a/test/lib/test/unit.rb +++ b/test/lib/test/unit.rb @@ -134,6 +134,23 @@ module Test options end + def non_options(files, options) + if !options[:parallel] and + /(?:\A|\s)--jobserver-auth=(\d+),(\d+)/ =~ ENV["MAKEFLAGS"] + begin + r = IO.for_fd($1.to_i(10), "rb", autoclose: false) + w = IO.for_fd($2.to_i(10), "wb", autoclose: false) + rescue + r.close if r + nil + else + @jobserver = [r, w] + options[:parallel] ||= 1 + end + end + super + end + def status(*args) result = super raise @interrupt if @interrupt @@ -173,9 +190,11 @@ module Test class Worker def self.launch(ruby,args=[]) + opts = {} + @jobserver.each {|fd| opts[fd] = fd} if @jobserver io = IO.popen([*ruby, "-W1", "#{File.dirname(__FILE__)}/unit/parallel.rb", - *args], "rb+") + *args], "rb+", opts) new(io, io.pid, :waiting) end @@ -417,6 +436,7 @@ module Test @workers = [] # Array of workers. @workers_hash = {} # out-IO => worker @ios = [] # Array of worker IOs + job_tokens = String.new(encoding: Encoding::ASCII_8BIT) if @jobserver begin [@tasks.size, @options[:parallel]].min.times {launch_worker} @@ -426,6 +446,13 @@ module Test (deal(io, type, result, rep).nil? and !@workers.any? {|x| [:running, :prepare].include? x.status}) end + if job_tokens and !@tasks.empty? and !@workers.any? {|x| x.status == :ready} + t = @jobserver[0].read_nonblock([@tasks.size, @options[:parallel]].min, exception: false) + if String === t + job_tokens << t + t.size.times {launch_worker} + end + end end rescue Interrupt => ex @interrupt = ex @@ -439,6 +466,10 @@ module Test end quit_workers + if @jobserver + @jobserver[1] << job_tokens + job_tokens.clear + end unless @interrupt || !@options[:retry] || @need_quit parallel = @options[:parallel]