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