Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Change Guard::Interactor#lock and #unlock methods so they will lock i…

…nteractor

in the right thread and free $stdin [closes #137].
  • Loading branch information...
commit 8c6a30795a0c22826f5d6f6ebc4b49e337e0ae4e 1 parent 443f57e
@hron authored
Showing with 30 additions and 19 deletions.
  1. +30 −19 lib/guard/interactor.rb
View
49 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 @@ def start
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
Please sign in to comment.
Something went wrong with that request. Please try again.