Sha256: 123aeada5c9ba5ec609a40de1c1fd82f87465918e97b96011dad31b049f84c98

Contents?: true

Size: 1.08 KB

Versions: 10

Compression:

Stored size: 1.08 KB

Contents

require 'thread'
require 'timers'

class RestCore::Timer
  @mutex = Mutex.new
  @interval = 1

  singleton_class.module_eval do
    attr_accessor :interval

    def group
      @group ||= @mutex.synchronize{ @group ||= group_new }
    end

    private
    def group_new
      g = Timers::Group.new
      g.every(interval){}
      @thread = Thread.new do
        begin
          g.wait
        rescue => e
          warn "RestCore::Timer: ERROR: #{e}\n  from #{e.backtrace.inspect}"
        end while g.count > 1
        @group = nil
      end
      g
    end
  end

  attr_accessor :timeout, :error, :timer
  def initialize timeout, error, &block
    self.timeout = timeout
    self.error   = error
    self.block   = block
    start if block_given?
  end

  def on_timeout &block
    self.block = block
    start if block_given?
  end

  # should never raise!
  def cancel
    timer.cancel if timer
    self.block = nil
  end

  def start
    return if timeout.nil? || timeout.zero?
    self.timer = self.class.group.after(timeout){ block.call if block }
  end

  protected
  attr_accessor :block
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
rest-core-3.6.0 lib/rest-core/timer.rb
rest-core-3.5.92 lib/rest-core/timer.rb
rest-core-3.5.91 lib/rest-core/timer.rb
rest-core-3.5.9 lib/rest-core/timer.rb
rest-core-3.5.8 lib/rest-core/timer.rb
rest-core-3.5.7 lib/rest-core/timer.rb
rest-core-3.5.6 lib/rest-core/timer.rb
rest-core-3.5.5 lib/rest-core/timer.rb
rest-core-3.5.4 lib/rest-core/timer.rb
rest-core-3.5.3 lib/rest-core/timer.rb