module Delayer::Priority::Extend

Public Class Methods

extended(klass) click to toggle source
# File lib/delayer/priority.rb, line 20
def self.extended(klass)
  klass.class_eval do
    @priority_pointer = {}
  end
end

Public Instance Methods

get_prev_point(priority) click to toggle source
# File lib/delayer/priority.rb, line 52
def get_prev_point(priority)
  if @priority_pointer[priority]
    @priority_pointer[priority]
  else
    next_index = @priorities.index(priority) - 1
    get_prev_point @priorities[next_index] if 0 <= next_index
  end
end
register(procedure) click to toggle source

register new job.

Args

procedure

job(Delayer::Procedure)

Return

self

# File lib/delayer/priority.rb, line 31
def register(procedure)
  priority = procedure.delayer.priority
  lock.synchronize do
    last_pointer = get_prev_point(priority)
    if last_pointer
      @priority_pointer[priority] = last_pointer.break procedure
    else
      procedure.next = @first_pointer
      @priority_pointer[priority] = @first_pointer = procedure
    end
    if @last_pointer
      @last_pointer = @priority_pointer[priority]
    end
    if @remain_hook and not @remain_received
      @remain_received = true
      @remain_hook.call
    end
  end
  self
end
validate_priority(symbol) click to toggle source
# File lib/delayer/priority.rb, line 61
def validate_priority(symbol)
  unless @priorities.include? symbol
    raise Delayer::InvalidPriorityError, "undefined priority '#{symbol}'"
  end
end

Private Instance Methods

forward() click to toggle source
# File lib/delayer/priority.rb, line 69
def forward
  lock.synchronize do
    prev = @first_pointer
    @first_pointer = @first_pointer.next
    @last_pointer = nil unless @first_pointer
    @priority_pointer.each do |priority, pointer|
      @priority_pointer[priority] = @first_pointer if prev == pointer
    end
    prev
  end
end