Sha256: 23002b33abff8dd467f6d5551d68be5796a62c86821efd584665e1b3b59ed0ae

Contents?: true

Size: 1.4 KB

Versions: 32

Compression:

Stored size: 1.4 KB

Contents

require 'gh'
require 'thread'
require 'backports/basic_object' unless defined? BasicObject

module GH
  # Public: ...
  class Parallel < Wrapper
    attr_accessor :parallelize

    class Dummy < BasicObject
      attr_accessor :__delegate__
      def method_missing(*args)
        ::Kernel.raise ::RuntimeError, "response not yet loaded" if __delegate__.nil?
        __delegate__.__send__(*args)
      end
    end

    def setup(*)
      @parallelize = true if @parallelize.nil?
      @in_parallel = false
      @mutex       = Mutex.new
      @queue       = []
      super
    end

    def generate_response(key, response)
      return super unless in_parallel?
      dummy = Dummy.new
      @mutex.synchronize { @queue << [dummy, key, response] }
      dummy
    end

    def in_parallel
      return yield if in_parallel? or not @parallelize
      was, @in_parallel = @in_parallel, true
      result = nil
      connection.in_parallel { result = yield }
      @mutex.synchronize do
        @queue.each { |dummy, key, response| dummy.__delegate__ = backend.generate_response(key, response) }
        @queue.clear
      end
      result
    ensure
      @in_parallel = was unless was.nil?
    end

    def in_parallel?
      @in_parallel
    end

    def connection
      @connection ||= begin
        layer = backend
        layer = layer.backend until layer.respond_to? :connection
        layer.connection
      end
    end
  end
end

Version data entries

32 entries across 32 versions & 2 rubygems

Version Path
gh-0.18.0 lib/gh/parallel.rb
gh-0.17.0 lib/gh/parallel.rb
gh-0.16.0 lib/gh/parallel.rb
gh-0.16.0.beta1 lib/gh/parallel.rb
gh-akerl-0.15.1.1 lib/gh/parallel.rb
gh-akerl-0.15.1 lib/gh/parallel.rb
gh-0.15.1 lib/gh/parallel.rb
gh-0.15.0 lib/gh/parallel.rb
gh-0.14.0 lib/gh/parallel.rb
gh-0.13.3 lib/gh/parallel.rb
gh-0.13.2 lib/gh/parallel.rb
gh-0.13.1 lib/gh/parallel.rb
gh-0.13.0 lib/gh/parallel.rb
gh-0.12.4 lib/gh/parallel.rb
gh-0.12.3 lib/gh/parallel.rb
gh-0.12.2 lib/gh/parallel.rb
gh-0.12.1 lib/gh/parallel.rb
gh-0.12.0 lib/gh/parallel.rb
gh-0.11.3 lib/gh/parallel.rb
gh-0.11.2 lib/gh/parallel.rb