ruby-changes:45441
From: nobu <ko1@a...>
Date: Fri, 3 Feb 2017 21:52:14 +0900 (JST)
Subject: [ruby-changes:45441] nobu:r57514 (trunk): test/unit.rb: share job slots
nobu 2017-02-03 21:52:09 +0900 (Fri, 03 Feb 2017) New Revision: 57514 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=57514 Log: test/unit.rb: share job slots * test/lib/test/unit.rb (Test::Unit::Parallel#_run_parallel): share job slots with GNU 'make'. Modified files: trunk/common.mk trunk/defs/gmake.mk trunk/test/lib/test/unit.rb Index: common.mk =================================================================== --- common.mk (revision 57513) +++ common.mk (revision 57514) @@ -11,6 +11,8 @@ Q = $(Q1:0=@) https://github.com/ruby/ruby/blob/trunk/common.mk#L11 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 https://github.com/ruby/ruby/blob/trunk/common.mk#L626 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-basi https://github.com/ruby/ruby/blob/trunk/common.mk#L636 # 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)" Index: test/lib/test/unit.rb =================================================================== --- test/lib/test/unit.rb (revision 57513) +++ test/lib/test/unit.rb (revision 57514) @@ -134,6 +134,23 @@ module Test https://github.com/ruby/ruby/blob/trunk/test/lib/test/unit.rb#L134 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 https://github.com/ruby/ruby/blob/trunk/test/lib/test/unit.rb#L190 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 https://github.com/ruby/ruby/blob/trunk/test/lib/test/unit.rb#L436 @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 https://github.com/ruby/ruby/blob/trunk/test/lib/test/unit.rb#L446 (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 https://github.com/ruby/ruby/blob/trunk/test/lib/test/unit.rb#L466 end quit_workers + if @jobserver + @jobserver[1] << job_tokens + job_tokens.clear + end unless @interrupt || !@options[:retry] || @need_quit parallel = @options[:parallel] Index: defs/gmake.mk =================================================================== --- defs/gmake.mk (revision 57513) +++ defs/gmake.mk (revision 57514) @@ -1,5 +1,6 @@ https://github.com/ruby/ruby/blob/trunk/defs/gmake.mk#L1 # -*- makefile-gmake -*- gnumake = yes +override gnumake_recursive := + CHECK_TARGETS := exam love check% TEST_TARGETS := $(filter check test check% test% btest%,$(MAKECMDGOALS)) -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/