class Going::SelectStatement

Attributes

args[R]
complete_mutex[R]
on_complete[R]
once_mutex[R]
semaphore[R]
when_completes[R]

Public Class Methods

instance() click to toggle source
# File lib/going/select_statement.rb, line 7
def instance
  Thread.current[global_key]
end
instance?() click to toggle source
# File lib/going/select_statement.rb, line 11
def instance?
  !instance.nil?
end
new() click to toggle source
# File lib/going/select_statement.rb, line 34
def initialize
  @completed = false
  @once_mutex = Mutex.new
  @complete_mutex = Mutex.new
  @semaphore = ConditionVariable.new
  @when_completes = []

  @args = nil
  @on_complete = nil
end
new_instance() click to toggle source
# File lib/going/select_statement.rb, line 15
def new_instance
  self.instance = new
end
reset() click to toggle source
# File lib/going/select_statement.rb, line 19
def reset
  self.instance = nil
end

Private Class Methods

global_key() click to toggle source
# File lib/going/select_statement.rb, line 29
def global_key
  @global_key ||= "Going_#{Going::SelectStatement.object_id}"
end
instance=(select_statement) click to toggle source
# File lib/going/select_statement.rb, line 25
def instance=(select_statement)
  Thread.current[global_key] = select_statement
end

Public Instance Methods

call_completion_block() click to toggle source
# File lib/going/select_statement.rb, line 90
def call_completion_block
  on_complete.call(*args) if on_complete
end
complete(*args, &on_complete) click to toggle source
# File lib/going/select_statement.rb, line 61
def complete(*args, &on_complete)
  complete_mutex.synchronize do
    if !completed?
      @args = args
      @on_complete = on_complete
      @completed = true
      @secondary_completed = true
      semaphore.signal
    end
  end
end
once(*args) { |*args| ... } click to toggle source
# File lib/going/select_statement.rb, line 84
def once(*args, &blk)
  once_mutex.synchronize do
    yield(*args) if block_given? && incomplete?
  end
end
secondary_complete(*args, &on_complete) click to toggle source
# File lib/going/select_statement.rb, line 73
def secondary_complete(*args, &on_complete)
  complete_mutex.synchronize do
    if !secondary_completed?
      @args = args
      @on_complete = on_complete
      @secondary_completed = true
      semaphore.signal
    end
  end
end
select() { |select_helper| ... } click to toggle source
# File lib/going/select_statement.rb, line 45
def select(&blk)
  select_helper = SelectHelper.instance
  if blk.arity == 1
    yield select_helper
  else
    select_helper.instance_eval(&blk)
  end

  wait
  cleanup
end
when_complete(*args, &callback) click to toggle source
# File lib/going/select_statement.rb, line 57
def when_complete(*args, &callback)
  when_completes << proc { callback.call(*args) }
end

Private Instance Methods

cleanup() click to toggle source
# File lib/going/select_statement.rb, line 116
def cleanup
  when_completes.each(&:call)
end
incomplete?() click to toggle source
# File lib/going/select_statement.rb, line 106
def incomplete?
  complete_mutex.synchronize do
    !completed?
  end
end
wait() click to toggle source
# File lib/going/select_statement.rb, line 100
def wait
  complete_mutex.synchronize do
    semaphore.wait(complete_mutex) until wake?
  end
end
wake?() click to toggle source
# File lib/going/select_statement.rb, line 112
def wake?
  completed? || secondary_completed?
end