class Floss::Latch
Based on Celluloid::Condition.
Constants
- SignalConditionRequest
Public Class Methods
new()
click to toggle source
# File lib/floss/latch.rb, line 9 def initialize @tasks = [] @mutex = Mutex.new @ready = false @values = nil end
Public Instance Methods
ready?()
click to toggle source
# File lib/floss/latch.rb, line 16 def ready? @mutex.synchronize { @ready } end
signal(*values)
click to toggle source
# File lib/floss/latch.rb, line 43 def signal(*values) @mutex.synchronize do return false if @ready @ready = true @values = values @tasks.each { |waiter| waiter << SignalConditionRequest.new(waiter.task, values) } end end
wait()
click to toggle source
# File lib/floss/latch.rb, line 20 def wait raise LatchError, "cannot wait for signals while exclusive" if Celluloid.exclusive? task = Thread.current[:celluloid_actor] ? Celluloid::Task.current : Thread.current waiter = Celluloid::Condition::Waiter.new(self, task, Celluloid.mailbox) ready = @mutex.synchronize do ready = @ready @tasks << waiter unless ready ready end values = if ready @values else values = Celluloid.suspend(:condwait, waiter) raise values if values.is_a?(LatchError) values end values.size == 1 ? values.first : values end