Mutex
A subclass of Mutex that allows clients to discover which thread has the mutex locked. This is necessary for (among other things) discovering cycles in the dependency graph of services.
Create a new unlocked QueryableMutex.
# File lib/needle/thread.rb, line 27 def initialize super @locking_thread = nil end
Checks to see if the current thread has the mutex locked, and if it does, raises an exception. Otherwise, locks the mutex and sets the locking thread to Thread.current.
# File lib/needle/thread.rb, line 35 def lock if @locking_thread == Thread.current raise ThreadError, "an attempt was made to reacquire an existing lock " + "(this could happen if you have a circular dependency on a service)" end while (Thread.critical = true; @locked) @waiting.push Thread.current Thread.stop end @locked = true @locking_thread = Thread.current Thread.critical = false self end
Return true if the current thread has locked this mutex.
# File lib/needle/thread.rb, line 87 def self_locked? @locking_thread == Thread.current end
Attempts to acquire the lock. Returns true if the lock was acquired, and false if the mutex was already locked.
# File lib/needle/thread.rb, line 54 def try_lock result = false Thread.critical = true unless @locked @locked = true result = true @locking_thread = Thread.current end Thread.critical = false result end
Unlocks the mutex and sets the locking thread to nil.
# File lib/needle/thread.rb, line 67 def unlock return unless @locked Thread.critical = true @locked = false begin t = @waiting.shift t.wakeup if t rescue ThreadError retry end @locking_thread = nil Thread.critical = false begin t.run if t rescue ThreadError end self end
Generated with the Darkfish Rdoc Generator 2.