class EventMachine::Synchrony::Thread::ConditionVariable

def _wakeup(mutex, fiber)

def _wakeup(mutex, fiber)
  if alive = fiber.alive?
    EM.next_tick {
      mutex._wakeup(fiber)
    }
  end
  alive
end

def broadcast


Wakes up all threads waiting for this lock.
def broadcast
  @waiters.each do |mutex, fiber|
    _wakeup(mutex, fiber)
  end
  @waiters.clear
  self
end

def initialize


Creates a new ConditionVariable
def initialize
  @waiters = []
end

def signal


Wakes up the first thread in line waiting for this lock.
def signal
  while (pair = @waiters.shift)
    break if _wakeup(*pair)
  end
  self
end

def wait(mutex, timeout=nil)


even if no other thread doesn't signal.
If +timeout+ is given, this method returns after +timeout+ seconds passed,

Releases the lock held in +mutex+ and waits; reacquires the lock on wakeup.
def wait(mutex, timeout=nil)
  current = Fiber.current
  pair = [mutex, current]
  @waiters << pair
  mutex.sleep timeout do
    @waiters.delete pair
  end
  self
end