threads/waiting_on_a_child.rb

tests/_examples/threads/waiting_on_a_child.rb in the metorex repository.

# A thread waiting on a child process lets the other threads run, so the
# main thread can make the file each child is waiting to see.

require "tmpdir"

def wait_for(path)
  "while [ ! -e #{path} ]; do sleep 0.01; done"
end

def release(thread, path)
  Thread.pass until thread.status == "sleep"
  File.write(path, "")
  thread.value
end

Dir.mktmpdir do |directory|
  path = File.join(directory, "system")
  p(release(Thread.new { system(wait_for(path)) }, path))

  path = File.join(directory, "backticks")
  p(release(Thread.new { `#{wait_for(path)}; echo seen` }, path))

  path = File.join(directory, "wait")
  child = spawn(wait_for(path))
  waiter = Thread.new { Process.wait(child) }
  p(release(waiter, path) == child)
end

Output:

true
"seen\n"
true