[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]