diff --git a/lib/guard/interactor.rb b/lib/guard/interactor.rb index 0abbb5a..e660fe6 100644 --- a/lib/guard/interactor.rb +++ b/lib/guard/interactor.rb @@ -1,6 +1,9 @@ module Guard class Interactor + class LockException < Exception; end + class UnlockException < Exception; end + attr_reader :locked def initialize @@ -11,35 +14,43 @@ module Guard return if ENV["GUARD_ENV"] == 'test' @thread = Thread.new do loop do - if (entry = $stdin.gets) && !@locked - entry.gsub! /\n/, '' - case entry - when 'stop', 'quit', 'exit', 's', 'q', 'e' - ::Guard.stop - when 'reload', 'r', 'z' - ::Guard.reload - when 'pause', 'p' - ::Guard.pause - else - ::Guard.run_all + begin + if !@locked && (entry = $stdin.gets) + entry.gsub! /\n/, '' + case entry + when 'stop', 'quit', 'exit', 's', 'q', 'e' + ::Guard.stop + when 'reload', 'r', 'z' + ::Guard.reload + when 'pause', 'p' + ::Guard.pause + else + ::Guard.run_all + end end + rescue LockException + lock + rescue UnlockException + unlock end end end end - def stop - @thread.kill - end - def lock - @locked = true - stop + if @thread == Thread.current + @locked = true + else + @thread.raise(LockException) + end end def unlock - @locked = false - start + if @thread == Thread.current + @locked = false + else + @thread.raise(UnlockException) + end end end