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