From 057f053f8cb1e5d5d7370dc1097959dd73a86526 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 14 Jul 2012 10:54:03 +0900 Subject: [PATCH 1/8] test/unit.rb: _run_parallel * lib/test/unit.rb (Test::Unit::Runner#_run_parallel): move initializations with nothing to release outside begin/ensure. --- lib/test/unit.rb | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/test/unit.rb b/lib/test/unit.rb index 01bbaa507fe169..6076eb85926dad 100644 --- a/lib/test/unit.rb +++ b/lib/test/unit.rb @@ -458,18 +458,18 @@ def _run_parallel suites, type, result return end - begin - # 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 + # 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 + begin # Array of workers. launch_worker = Proc.new { begin From 77b90a38356970c00e5dab0756353235fffa5cbc Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 14 Jul 2012 10:43:08 +0900 Subject: [PATCH 2/8] test/unit.rb: extract start_watchdog * lib/test/unit.rb (Test::Unit::Runner#start_watchdog): extract. --- lib/test/unit.rb | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/lib/test/unit.rb b/lib/test/unit.rb index 6076eb85926dad..22e092a56508de 100644 --- a/lib/test/unit.rb +++ b/lib/test/unit.rb @@ -452,6 +452,22 @@ def after_worker_quit(worker) @ios = @workers.map(&:io) end + def start_watchdog + Thread.new do + while stat = Process.wait2 + break if @interrupt # Break when interrupt + pid, stat = stat + w = (@workers + @dead_workers).find{|x| pid == x.pid } + next unless w + w = w.dup + if w.status != :quit && !w.quit_called? + # Worker down + w.died(nil, !stat.signaled? && stat.exitstatus) + end + end + end + end + def _run_parallel suites, type, result if @options[:parallel] < 1 warn "Error: parameter of -j option should be greater than 0." @@ -487,20 +503,7 @@ def _run_parallel suites, type, result @workers = @options[:parallel].times.map(&launch_worker) # Thread: watchdog - watchdog = Thread.new do - while stat = Process.wait2 - break if @interrupt # Break when interrupt - pid, stat = stat - w = (@workers + @dead_workers).find{|x| pid == x.pid } - next unless w - w = w.dup - if w.status != :quit && !w.quit_called? - # Worker down - w.died(nil, !stat.signaled? && stat.exitstatus) - end - end - end - + watchdog = start_watchdog @workers_hash = Hash[@workers.map {|w| [w.io,w] }] # out-IO => worker @ios = @workers.map{|w| w.io } # Array of worker IOs From 45a31468459c19ed04ae47c55f05f048cf53baab Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 14 Jul 2012 03:47:09 +0900 Subject: [PATCH 3/8] test/unit.rb: extract launch_worker * lib/test/unit.rb (Test::Unit::Runner#launch_worker): extract. --- lib/test/unit.rb | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/test/unit.rb b/lib/test/unit.rb index 22e092a56508de..91abec71f0fed7 100644 --- a/lib/test/unit.rb +++ b/lib/test/unit.rb @@ -452,6 +452,19 @@ def after_worker_quit(worker) @ios = @workers.map(&:io) end + def launch_worker + begin + worker = Worker.launch(@options[:ruby],@args) + rescue => e + abort "ERROR: Failed to launch job process - #{e.class}: #{e.message}" + end + worker.hook(:dead) do |w,info| + after_worker_quit w + after_worker_down w, *info if !info.empty? && !worker.quit_called + end + worker + end + def start_watchdog Thread.new do while stat = Process.wait2 @@ -487,20 +500,7 @@ def _run_parallel suites, type, result begin # Array of workers. - launch_worker = Proc.new { - begin - worker = Worker.launch(@options[:ruby],@args) - rescue => e - warn "ERROR: Failed to launch job process - #{e.class}: #{e.message}" - exit 1 - end - worker.hook(:dead) do |w,info| - after_worker_quit w - after_worker_down w, *info if !info.empty? && !worker.quit_called - end - worker - } - @workers = @options[:parallel].times.map(&launch_worker) + @workers = @options[:parallel].times.map {launch_worker} # Thread: watchdog watchdog = start_watchdog @@ -527,7 +527,7 @@ def _run_parallel suites, type, result @workers_hash.delete worker.io @workers.delete worker @ios.delete worker.io - new_worker = launch_worker.call() + new_worker = launch_worker worker.quit @workers << new_worker @ios << new_worker.io From 5a7d90090b1a8d4878c980bd84b13d72abf51af9 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 14 Jul 2012 10:57:01 +0900 Subject: [PATCH 4/8] test/unit.rb: launch_worker to manage new worker * lib/test/unit.rb (Test::Unit::Runner#launch_worker): add new worker to working set. --- lib/test/unit.rb | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/lib/test/unit.rb b/lib/test/unit.rb index 91abec71f0fed7..8a8e5c20839f28 100644 --- a/lib/test/unit.rb +++ b/lib/test/unit.rb @@ -462,6 +462,9 @@ def launch_worker after_worker_quit w after_worker_down w, *info if !info.empty? && !worker.quit_called end + @workers << worker + @ios << worker.io + @workers_hash[worker.io] = worker worker end @@ -498,14 +501,14 @@ def _run_parallel suites, type, result shutting_down = false rep = [] # FIXME: more good naming + @workers = [] # Array of workers. + @workers_hash = {} # out-IO => worker + @ios = [] # Array of worker IOs begin - # Array of workers. - @workers = @options[:parallel].times.map {launch_worker} - # Thread: watchdog watchdog = start_watchdog - @workers_hash = Hash[@workers.map {|w| [w.io,w] }] # out-IO => worker - @ios = @workers.map{|w| w.io } # Array of worker IOs + + @options[:parallel].times {launch_worker} while _io = IO.select(@ios)[0] break unless _io.each do |io| @@ -527,12 +530,8 @@ def _run_parallel suites, type, result @workers_hash.delete worker.io @workers.delete worker @ios.delete worker.io - new_worker = launch_worker worker.quit - @workers << new_worker - @ios << new_worker.io - @workers_hash[new_worker.io] = new_worker - worker = new_worker + worker = launch_worker end worker.run(@tasks.shift, type) @test_count += 1 From f2293a15ffeb36decfc6ddc98f7e6bddd19f6d7f Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 14 Jul 2012 10:58:16 +0900 Subject: [PATCH 5/8] test/unit.rb: extract delete_worker * lib/test/unit.rb (Test::Unit::Runner#delete_worker): delete dead worker from working set. --- lib/test/unit.rb | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/test/unit.rb b/lib/test/unit.rb index 8a8e5c20839f28..0545579b23466e 100644 --- a/lib/test/unit.rb +++ b/lib/test/unit.rb @@ -468,6 +468,12 @@ def launch_worker worker end + def delete_worker(worker) + @workers_hash.delete worker.io + @workers.delete worker + @ios.delete worker.io + end + def start_watchdog Thread.new do while stat = Process.wait2 @@ -527,9 +533,7 @@ def _run_parallel suites, type, result end else if @options[:separate] && bang.empty? - @workers_hash.delete worker.io - @workers.delete worker - @ios.delete worker.io + delete_worker(workers) worker.quit worker = launch_worker end From 34f524f3ec780eccd9016a0676c37013fb87e9ca Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 14 Jul 2012 11:04:46 +0900 Subject: [PATCH 6/8] test/unit.rb: extract quit_workers * lib/test/unit.rb (Test::Unit::Runner#quit_workers): close and kill all workers. --- lib/test/unit.rb | 63 +++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/lib/test/unit.rb b/lib/test/unit.rb index 0545579b23466e..92c3e0f5e0e5bc 100644 --- a/lib/test/unit.rb +++ b/lib/test/unit.rb @@ -310,10 +310,9 @@ def read end def close - begin - @io.close unless @io.closed? - rescue IOError; end + @io.close unless @io.closed? self + rescue IOError end def quit @@ -323,6 +322,11 @@ def quit @io.close end + def kill + Process.kill(:KILL, @pid) + rescue Errno::ESRCH + end + def died(*additional) @status = :quit @io.close @@ -474,6 +478,32 @@ def delete_worker(worker) @ios.delete worker.io end + def quit_workers + return if @workers.empty? + @workers.reject! do |worker| + begin + timeout(1) do + worker.quit + end + rescue Errno::EPIPE + rescue Timeout::Error + end + worker.close + end + + return if @workers.empty? + begin + timeout(0.2 * @workers.size) do + Process.waitall + end + rescue Timeout::Error + @workers.each do |worker| + worker.kill + end + @worker.clear + end + end + def start_watchdog Thread.new do while stat = Process.wait2 @@ -592,32 +622,9 @@ def _run_parallel suites, type, result end end - if @workers - @workers.each do |worker| - begin - timeout(1) do - worker.quit - end - rescue Errno::EPIPE - rescue Timeout::Error - end - worker.close - end - - begin - timeout(0.2*@workers.size) do - Process.waitall - end - rescue Timeout::Error - @workers.each do |worker| - begin - Process.kill(:KILL,worker.pid) - rescue Errno::ESRCH; end - end - end - end + quit_workers - if !(@interrupt || !@options[:retry] || @need_quit) && @workers + unless @interrupt || !@options[:retry] || @need_quit @options[:parallel] = false suites, rep = rep.partition {|r| r[:testcase] && r[:file] && !r[:report].empty?} suites.map {|r| r[:file]}.uniq.each {|file| require file} From 8075285879900d4041d33afe948da1420c046804 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 14 Jul 2012 11:54:01 +0900 Subject: [PATCH 7/8] test/unit.rb: extract deal * lib/test/unit.rb (Test::Unit::Runner#deal): deal tasks to workers. --- lib/test/unit.rb | 111 ++++++++++++++++++++--------------------------- 1 file changed, 48 insertions(+), 63 deletions(-) diff --git a/lib/test/unit.rb b/lib/test/unit.rb index 92c3e0f5e0e5bc..fbeceb9e546d5d 100644 --- a/lib/test/unit.rb +++ b/lib/test/unit.rb @@ -520,6 +520,49 @@ def start_watchdog end end + def deal(io, type, result, rep, shutting_down = false) + worker = @workers_hash[io] + case worker.read + when /^okay$/ + worker.status = :running + jobs_status + when /^ready(!)?$/ + bang = $1 + worker.status = :ready + + return nil unless task = @tasks.shift + if @options[:separate] and not bang + worker.quit + worker = add_worker + end + worker.run(task, type) + @test_count += 1 + + jobs_status + 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! + return true + when /^p (.+?)$/ + del_jobs_status + print $1.unpack("m")[0] + jobs_status if @options[:job_status] == :replace + when /^after (.+?)$/ + @warnings << Marshal.load($1.unpack("m")[0]) + when /^bye (.+?)$/ + after_worker_down worker, Marshal.load($1.unpack("m")[0]) + when /^bye$/, nil + if shutting_down || worker.quit_called + after_worker_quit worker + else + after_worker_down worker + end + end + return false + end + def _run_parallel suites, type, result if @options[:parallel] < 1 warn "Error: parameter of -j option should be greater than 0." @@ -534,7 +577,6 @@ def _run_parallel suites, type, result @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. @@ -547,78 +589,21 @@ def _run_parallel suites, type, result @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] - case worker.read - when /^okay$/ - worker.status = :running - jobs_status - when /^ready(!?)$/ - bang = $1 - worker.status = :ready - if @tasks.empty? - unless @workers.find{|x| [:running, :prepare].include? x.status} - break - end - else - if @options[:separate] && bang.empty? - delete_worker(workers) - worker.quit - worker = launch_worker - end - worker.run(@tasks.shift, type) - @test_count += 1 - end - - jobs_status - 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! - when /^p (.+?)$/ - del_jobs_status - print $1.unpack("m")[0] - jobs_status if @options[:job_status] == :replace - when /^after (.+?)$/ - @warnings << Marshal.load($1.unpack("m")[0]) - when /^bye (.+?)$/ - after_worker_down worker, Marshal.load($1.unpack("m")[0]) - when /^bye$/, nil - if shutting_down || worker.quit_called - after_worker_quit worker - else - after_worker_down worker - end - end - break if @need_quit + 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 rescue Interrupt => e @interrupt = e return result ensure - shutting_down = true - watchdog.kill if watchdog if @interrupt @ios.select!{|x| @workers_hash[x].status == :running } while !@ios.empty? && (__io = IO.select(@ios,[],[],10)) - _io = __io[0] - _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 + __io[0].reject! {|io| deal(io, type, result, rep, true)} end end From 0d4355c4899730e33a8766064bff675ea1ff37d7 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 14 Jul 2012 11:54:47 +0900 Subject: [PATCH 8/8] test/unit.rb: use uniq! * lib/test/unit.rb (Test::Unit::Runner#_run_parallel): use Array#uniq!. --- lib/test/unit.rb | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/test/unit.rb b/lib/test/unit.rb index fbeceb9e546d5d..e8afbbcaa279f3 100644 --- a/lib/test/unit.rb +++ b/lib/test/unit.rb @@ -632,12 +632,7 @@ def _run_parallel suites, type, result end unless @warnings.empty? warn "" - ary = [] - @warnings.reject! do |w| - r = ary.include?(w[1].message) - ary << w[1].message - r - end + @warnings.uniq! {|w| w[1].message} @warnings.each do |w| warn "#{w[0]}: #{w[1].message} (#{w[1].class})" end pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy