vagrant/lib/vagrant/busy.rb

80 lines
1.7 KiB
Ruby
Raw Normal View History

module Vagrant
2010-02-09 06:38:32 +00:00
def self.busy?
Busy.busy?
end
def self.busy(&block)
2010-02-09 06:54:21 +00:00
Busy.busy(&block)
2010-02-09 06:38:32 +00:00
end
class Busy
extend Vagrant::Util
2010-02-09 06:38:32 +00:00
@@busy = false
2010-02-09 06:54:21 +00:00
@@mutex = Mutex.new
@@trap_thread = nil
2010-02-09 06:38:32 +00:00
class << self
def busy?
@@busy
end
def busy=(val)
@@busy = val
end
2010-02-09 06:54:21 +00:00
def busy(&block)
@@mutex.synchronize do
begin
Signal.trap("INT") { wait_for_not_busy }
Busy.busy = true
block.call
ensure
# In the case an exception is thrown, make sure we restore
# busy back to some sane state.
Busy.busy = false
# Make sure that the trap thread completes, if it is running
trap_thread.join if trap_thread
# And restore the INT trap to the default
Signal.trap("INT", "DEFAULT")
end
2010-02-09 06:54:21 +00:00
end
end
def wait_for_not_busy(sleeptime=5)
if @@trap_thread
2010-05-21 03:54:34 +00:00
# logger.info "Exiting vagrant immediately!"
Thread.kill(@@trap_thread)
abort
return # for tests
end
@@trap_thread ||= Thread.new do
# Wait while the app is busy
loop do
break unless busy?
2010-05-21 03:54:34 +00:00
# logger.info "Waiting for vagrant to clean itself up..."
sleep sleeptime
end
# Exit out of the entire script
2010-05-21 03:54:34 +00:00
# logger.info "Exiting vagrant..."
exit
end
end
# Used for testing
def reset_trap_thread!
@@trap_thread = nil
end
# Returns the trap thread
def trap_thread
@@trap_thread
end
2010-02-09 06:38:32 +00:00
end
end
end