2017-05-07 12:04:49 +00:00
|
|
|
require 'thread'
|
|
|
|
|
|
|
|
pid_file = ARGV.shift
|
|
|
|
scenario = ARGV.shift
|
|
|
|
|
|
|
|
# We must do this first otherwise there will be a race with the process that
|
|
|
|
# creates this process and the TERM signal below could go to that process
|
|
|
|
# instead, which will likely abort the specs process.
|
2017-05-10 14:18:10 +00:00
|
|
|
Process.setsid if scenario
|
2017-05-07 12:04:49 +00:00
|
|
|
|
|
|
|
mutex = Mutex.new
|
|
|
|
|
|
|
|
Signal.trap(:TERM) do
|
|
|
|
if mutex.try_lock
|
2017-05-10 14:18:23 +00:00
|
|
|
STDOUT.puts "signaled"
|
|
|
|
STDOUT.flush
|
|
|
|
$signaled = true
|
2017-05-07 12:04:49 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
File.open(pid_file, "wb") { |f| f.puts Process.pid }
|
|
|
|
|
|
|
|
if scenario
|
2017-05-10 14:18:10 +00:00
|
|
|
# We are sending a signal to the process group
|
|
|
|
process = "Process.getpgrp"
|
2017-05-07 12:04:49 +00:00
|
|
|
|
|
|
|
case scenario
|
|
|
|
when "self"
|
|
|
|
signal = %["SIGTERM"]
|
|
|
|
process = "0"
|
|
|
|
when "group_numeric"
|
|
|
|
signal = %[-Signal.list["TERM"]]
|
|
|
|
when "group_short_string"
|
|
|
|
signal = %["-TERM"]
|
|
|
|
when "group_full_string"
|
|
|
|
signal = %["-SIGTERM"]
|
|
|
|
else
|
|
|
|
raise "unknown scenario: #{scenario.inspect}"
|
|
|
|
end
|
|
|
|
|
2017-05-10 14:17:58 +00:00
|
|
|
code = "Process.kill(#{signal}, #{process})"
|
2017-05-10 14:35:38 +00:00
|
|
|
system(ENV["RUBY_EXE"], *ENV["RUBY_FLAGS"].split(' '), "-e", code)
|
2017-05-07 12:04:49 +00:00
|
|
|
end
|
|
|
|
|
2017-05-10 14:18:23 +00:00
|
|
|
sleep 0.001 until mutex.locked? and $signaled
|