Sha256: 7e2ab924405200ef1ac462597a4beddf98658d6c7fec806becbab3419e15b76c

Contents?: true

Size: 1.68 KB

Versions: 39

Compression:

Stored size: 1.68 KB

Contents

require 'thread'
require 'copy_tuner_client/cache'
require 'copy_tuner_client/queue_with_timeout'

module CopyTunerClient
  # Starts a background thread that continually resynchronizes with the remote
  # server using the given {Cache} after a set delay.
  class Poller
    # @param options [Hash]
    # @option options [Logger] :logger where errors should be logged
    # @option options [Fixnum] :polling_delay how long to wait in between requests
    def initialize(cache, options)
      @cache         = cache
      @polling_delay = options[:polling_delay]
      @logger        = options[:logger]
      @command_queue = CopyTunerClient::QueueWithTimeout.new
      @mutex         = Mutex.new
      @thread        = nil
    end

    def start
      @mutex.synchronize do
        if @thread.nil?
          @logger.info 'start poller thread'
          @thread = Thread.new { poll } or logger.error("Couldn't start poller thread")
        end
      end
    end

    def stop
      @mutex.synchronize do
        @command_queue.uniq_push(:stop)
        @thread.join if @thread
        @thread = nil
      end
    end

    def start_sync
      @command_queue.uniq_push(:sync)
    end

    def wait_for_download
      @cache.wait_for_download
    end

    private

    attr_reader :cache, :logger, :polling_delay

    def poll
      loop do
        cache.sync
        logger.flush if logger.respond_to?(:flush)
        begin
          command = @command_queue.pop_with_timeout(polling_delay)
          break if command == :stop
        rescue ThreadError
          # timeout
        end
      end
      @logger.info 'stop poller thread'
    rescue InvalidApiKey => error
      logger.error(error.message)
    end
  end
end

Version data entries

39 entries across 39 versions & 1 rubygems

Version Path
copy_tuner_client-0.19.0 lib/copy_tuner_client/poller.rb
copy_tuner_client-0.18.0 lib/copy_tuner_client/poller.rb
copy_tuner_client-0.17.1 lib/copy_tuner_client/poller.rb
copy_tuner_client-0.16.3 lib/copy_tuner_client/poller.rb
copy_tuner_client-0.16.2 lib/copy_tuner_client/poller.rb
copy_tuner_client-0.16.1 lib/copy_tuner_client/poller.rb
copy_tuner_client-0.16.0 lib/copy_tuner_client/poller.rb
copy_tuner_client-0.15.1 lib/copy_tuner_client/poller.rb
copy_tuner_client-0.15.0 lib/copy_tuner_client/poller.rb
copy_tuner_client-0.14.2 lib/copy_tuner_client/poller.rb
copy_tuner_client-0.14.1 lib/copy_tuner_client/poller.rb
copy_tuner_client-0.14.0 lib/copy_tuner_client/poller.rb
copy_tuner_client-0.13.6 lib/copy_tuner_client/poller.rb
copy_tuner_client-0.13.5 lib/copy_tuner_client/poller.rb
copy_tuner_client-0.13.3 lib/copy_tuner_client/poller.rb
copy_tuner_client-0.13.2 lib/copy_tuner_client/poller.rb
copy_tuner_client-0.13.1 lib/copy_tuner_client/poller.rb
copy_tuner_client-0.13.0 lib/copy_tuner_client/poller.rb
copy_tuner_client-0.12.0 lib/copy_tuner_client/poller.rb
copy_tuner_client-0.11.0 lib/copy_tuner_client/poller.rb