Class: EventMachine::Synchrony::Thread::ConditionVariable
- Inherits:
-
Object
- Object
- EventMachine::Synchrony::Thread::ConditionVariable
- Defined in:
- lib/em-synchrony/thread.rb
Instance Method Summary collapse
- #_wakeup(mutex, fiber) ⇒ Object
-
#broadcast ⇒ Object
Wakes up all threads waiting for this lock.
-
#initialize ⇒ ConditionVariable
constructor
Creates a new ConditionVariable.
-
#signal ⇒ Object
Wakes up the first thread in line waiting for this lock.
-
#wait(mutex, timeout = nil) ⇒ Object
Releases the lock held in
mutex
and waits; reacquires the lock on wakeup.
Constructor Details
#initialize ⇒ ConditionVariable
Creates a new ConditionVariable
74 75 76 |
# File 'lib/em-synchrony/thread.rb', line 74 def initialize @waiters = [] end |
Instance Method Details
#_wakeup(mutex, fiber) ⇒ Object
94 95 96 97 98 99 100 101 |
# File 'lib/em-synchrony/thread.rb', line 94 def _wakeup(mutex, fiber) if alive = fiber.alive? EM.next_tick { mutex._wakeup(fiber) } end alive end |
#broadcast ⇒ Object
Wakes up all threads waiting for this lock.
116 117 118 119 120 121 122 |
# File 'lib/em-synchrony/thread.rb', line 116 def broadcast @waiters.each do |mutex, fiber| _wakeup(mutex, fiber) end @waiters.clear self end |
#signal ⇒ Object
Wakes up the first thread in line waiting for this lock.
106 107 108 109 110 111 |
# File 'lib/em-synchrony/thread.rb', line 106 def signal while (pair = @waiters.shift) break if _wakeup(*pair) end self end |
#wait(mutex, timeout = nil) ⇒ Object
Releases the lock held in mutex
and waits; reacquires the lock on wakeup.
If timeout
is given, this method returns after timeout
seconds passed, even if no other thread doesn’t signal.
84 85 86 87 88 89 90 91 92 |
# File 'lib/em-synchrony/thread.rb', line 84 def wait(mutex, timeout=nil) current = Fiber.current pair = [mutex, current] @waiters << pair mutex.sleep timeout do @waiters.delete pair end self end |