1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

test/unit.rb: extract deal

* lib/test/unit.rb (Test::Unit::Runner#deal): deal tasks to workers.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36388 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2012-07-14 07:16:43 +00:00
parent 688f2e1a89
commit cbbe2cbca4
2 changed files with 51 additions and 64 deletions

View file

@ -1,4 +1,6 @@
Sat Jul 14 16:16:37 2012 Nobuyoshi Nakada <nobu@ruby-lang.org> Sat Jul 14 16:16:42 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* lib/test/unit.rb (Test::Unit::Runner#deal): deal tasks to workers.
* lib/test/unit.rb (Test::Unit::Runner#quit_workers): close and kill * lib/test/unit.rb (Test::Unit::Runner#quit_workers): close and kill
all workers. all workers.

View file

@ -520,64 +520,31 @@ module Test
end end
end end
def _run_parallel suites, type, result def deal(io, type, result, rep, shutting_down = false)
if @options[:parallel] < 1
warn "Error: parameter of -j option should be greater than 0."
return
end
# Require needed things for parallel running
require 'thread'
require 'timeout'
@tasks = @files.dup # Array of filenames.
@need_quit = false
@dead_workers = [] # Array of dead workers.
@warnings = []
@total_tests = @tasks.size.to_s(10)
shutting_down = false
rep = [] # FIXME: more good naming
@workers = [] # Array of workers.
@workers_hash = {} # out-IO => worker
@ios = [] # Array of worker IOs
begin
# Thread: watchdog
watchdog = start_watchdog
@options[:parallel].times {launch_worker}
while _io = IO.select(@ios)[0]
break unless _io.each do |io|
break if @need_quit
worker = @workers_hash[io] worker = @workers_hash[io]
case worker.read case worker.read
when /^okay$/ when /^okay$/
worker.status = :running worker.status = :running
jobs_status jobs_status
when /^ready(!?)$/ when /^ready(!)?$/
bang = $1 bang = $1
worker.status = :ready worker.status = :ready
if @tasks.empty?
unless @workers.find{|x| [:running, :prepare].include? x.status} return nil unless task = @tasks.shift
break if @options[:separate] and not bang
end
else
if @options[:separate] && bang.empty?
delete_worker(workers)
worker.quit worker.quit
worker = launch_worker worker = add_worker
end end
worker.run(@tasks.shift, type) worker.run(task, type)
@test_count += 1 @test_count += 1
end
jobs_status jobs_status
when /^done (.+?)$/ when /^done (.+?)$/
r = Marshal.load($1.unpack("m")[0]) r = Marshal.load($1.unpack("m")[0])
result << r[0..1] unless r[0..1] == [nil,nil] result << r[0..1] unless r[0..1] == [nil,nil]
rep << {file: worker.real_file, rep << {file: worker.real_file, report: r[2], result: r[3], testcase: r[5]}
report: r[2], result: r[3], testcase: r[5]}
$:.push(*r[4]).uniq! $:.push(*r[4]).uniq!
return true
when /^p (.+?)$/ when /^p (.+?)$/
del_jobs_status del_jobs_status
print $1.unpack("m")[0] print $1.unpack("m")[0]
@ -593,32 +560,50 @@ module Test
after_worker_down worker after_worker_down worker
end end
end end
break if @need_quit return false
end
def _run_parallel suites, type, result
if @options[:parallel] < 1
warn "Error: parameter of -j option should be greater than 0."
return
end
# Require needed things for parallel running
require 'thread'
require 'timeout'
@tasks = @files.dup # Array of filenames.
@need_quit = false
@dead_workers = [] # Array of dead workers.
@warnings = []
@total_tests = @tasks.size.to_s(10)
rep = [] # FIXME: more good naming
@workers = [] # Array of workers.
@workers_hash = {} # out-IO => worker
@ios = [] # Array of worker IOs
begin
# Thread: watchdog
watchdog = start_watchdog
@options[:parallel].times {launch_worker}
while _io = IO.select(@ios)[0]
break if _io.any? do |io|
@need_quit or
(deal(io, type, result, rep).nil? and
!@workers.any? {|x| [:running, :prepare].include? x.status})
end end
end end
rescue Interrupt => e rescue Interrupt => e
@interrupt = e @interrupt = e
return result return result
ensure ensure
shutting_down = true
watchdog.kill if watchdog watchdog.kill if watchdog
if @interrupt if @interrupt
@ios.select!{|x| @workers_hash[x].status == :running } @ios.select!{|x| @workers_hash[x].status == :running }
while !@ios.empty? && (__io = IO.select(@ios,[],[],10)) while !@ios.empty? && (__io = IO.select(@ios,[],[],10))
_io = __io[0] __io[0].reject! {|io| deal(io, type, result, rep, true)}
_io.each do |io|
worker = @workers_hash[io]
case worker.read
when /^done (.+?)$/
r = Marshal.load($1.unpack("m")[0])
result << r[0..1] unless r[0..1] == [nil,nil]
rep << {file: worker.real_file,
report: r[2], result: r[3], testcase: r[5]}
$:.push(*r[4]).uniq!
@ios.delete(io)
end
end
end end
end end