Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Thread-safe external process in ruby, plus checking exitstatus

I want to run a thread-safe piece of script in Ruby that calls an external program, then checks the exit status of that external program. What's the best way to do it? So far, I've been checking $?, but I think I'm getting a race condition with other parts of the program.

Here's some example code:

Thread.new do
  `external_program`
  if $?.exitstatus == 0
    # it worked.
  else
    # it didn't work.
  end
end

Ideally, I'd do something like

Process.new(`external_program`).exitstatus

so that the exitstatus was inextricably bound to that process, rather than the last one that happened to complete. Is there any way to do this?

like image 212
Peter Avatar asked Jan 29 '10 20:01

Peter


1 Answers

Although rb_last_status (aka $?) is a global variable, Ruby does a magic trick to make it per-thread: In rb_thread_save_context, it stores rb_last_status in the old thread's structure; rb_thread_restore_context sets rb_last_status from the saved value. If you've got a race condition involving $?, it's a Ruby bug.

like image 174
Wayne Conrad Avatar answered Sep 23 '22 14:09

Wayne Conrad