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