64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
# File 'lib/rbbt/util/semaphore.rb', line 64
def self.fork_each_on_semaphore(elems, size, file = nil)
with_semaphore(size, file) do |file|
begin
pids = elems.collect do |elem|
Process.fork do
begin
RbbtSemaphore.wait_semaphore(file)
begin
yield elem
ensure
RbbtSemaphore.post_semaphore(file)
end
rescue Interrupt
Log.error "Process #{Process.pid} was aborted"
end
end
end
pids.each do |pid| Process.waitpid pid end
rescue Exception
Log.error "Killing children: #{pids.sort * ", " }"
pids.each do |pid| begin Process.kill("INT", pid); rescue; end; end
pids.each do |pid| begin RbbtSemaphore.post_semaphore(file); rescue; end; end
Log.error "Ensuring children are dead: #{pids.sort * ", " }"
pids.each do |pid| begin Process.waitpid pid; rescue; end; end
end
end
end
|