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