@private A sorted, thread-safe list of scheduled Proc. Note: calls to process are always serialized, but calls to add may be concurrent.
# File lib/util/schedule.rb, line 36 def initialize() @lock = Mutex.new @items = [] @closed = false end
@return true if the Schedule was previously
empty @raise EOFError if schedule is closed @raise ThreadError if
non_block
and operation would block
# File lib/util/schedule.rb, line 49 def add(time, non_block=false, &proc) # non_block ignored for now, but we may implement a bounded schedule in future. @lock.synchronize do raise EOFError if @closed if at = (0...@items.size).bsearch { |i| @items[i].time > time } @items.insert(at, Item.new(time, proc)) else @items << Item.new(time, proc) end return @items.size == 1 end end
add raises EOFError after close. process can still be called to drain the schedule.
# File lib/util/schedule.rb, line 75 def close() @lock.synchronize { @closed = true } end
# File lib/util/schedule.rb, line 42 def next_tick() @lock.synchronize { @items.first.time unless @items.empty? } end
@return true if the Schedule became empty as a result of this call
# File lib/util/schedule.rb, line 63 def process(now) due = [] empty = @lock.synchronize do due << @items.shift while (!@items.empty? && before_eq(@items.first.time, now)) @items.empty? end due.each { |i| i.proc.call() } return empty && !due.empty? end