class EventMachine::Synchrony::Thread::Mutex
Fiber-aware drop-in replacements for thread objects
def _wakeup(fiber)
def _wakeup(fiber) fiber.resume if @slept.delete(fiber) end
def initialize
def initialize @waiters = [] @slept = {} end
def lock
def lock current = Fiber.current raise FiberError if @waiters.include?(current) @waiters << current Fiber.yield unless @waiters.first == current true end
def locked?
def locked? !@waiters.empty? end
def sleep(timeout = nil)
def sleep(timeout = nil) unlock beg = Time.now current = Fiber.current @slept[current] = true if timeout timer = EM.add_timer(timeout) do _wakeup(current) end Fiber.yield EM.cancel_timer timer # if we resumes not via timer else Fiber.yield end @slept.delete current yield if block_given? lock Time.now - beg end
def synchronize
def synchronize lock yield ensure unlock end
def try_lock
def try_lock lock unless locked? end
def unlock
def unlock raise FiberError unless @waiters.first == Fiber.current @waiters.shift unless @waiters.empty? EM.next_tick{ @waiters.first.resume } end self end