Method: MessageBus::TimerThread#queue

Defined in:
lib/message_bus/timer_thread.rb

#queue(delay = 0, &block) ⇒ Object

queue a block to run after a certain delay (in seconds)



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/message_bus/timer_thread.rb', line 60

def queue(delay = 0, &block)
  queue_time = Time.new.to_f + delay
  job = [queue_time, block]

  @mutex.synchronize do
    i = @jobs.length
    while i > 0
      i -= 1
      current, _ = @jobs[i]
      if current < queue_time
        i += 1
        break
      end
    end
    @jobs.insert(i, job)
    @next = queue_time if i == 0
  end

  unless @thread.alive?
    @mutex.synchronize do
      @thread = Thread.new { do_work } unless @thread.alive?
    end
  end

  if @thread.status == "sleep"
    @thread.wakeup
  end

  Cancelable.new(job)
end