class Qpid::Proton::Schedule

@private A sorted, thread-safe list of scheduled Proc. Note: calls to process are always serialized, but calls to add may be concurrent.

Constants

Item

Public Class Methods

new() click to toggle source
# File lib/util/schedule.rb, line 36
def initialize()
  @lock = Mutex.new
  @items = []
  @closed = false
end

Public Instance Methods

add(time, non_block=false, &proc) click to toggle source

@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
close() click to toggle source

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
next_tick() click to toggle source
# File lib/util/schedule.rb, line 42
def next_tick()
  @lock.synchronize { @items.first.time unless @items.empty? }
end
process(now) click to toggle source

@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