Sha256: c519f61125978a9b0093916342bdd66bc768d44f83bce424af327512171b9af6

Contents?: true

Size: 1.67 KB

Versions: 37

Compression:

Stored size: 1.67 KB

Contents

module Redcar
  class Resource
    attr_reader :block, :task
    
    class << self
      attr_accessor :compute_synchronously
    end
    
    def self.task_queue
      Redcar.app.task_queue
    end
    
    def initialize(description=nil, &block)
      @description = description
      @block  = block
      @value  = nil
      @future = nil
      @task   = nil
      @mutex  = Mutex.new
    end
    
    def value
      return @value if @value
      
      object = nil
      @mutex.synchronize do
        if @future
          if @task.pending?
            @task.cancel
            @future = nil
            @task   = nil
            object = @block
          else
            object = @future
          end
        else
          object = @block
        end
      end
      
      case object
      when Proc
        @value = object.call
      else
        @value = object.get
      end
    end
    
    def compute
      if Resource.compute_synchronously
        @value = block.call
      else
        @mutex.synchronize do
          unless @task and @task.pending?
            @task = Resource::Task.new(self)
            @task.description = @description
            @future = Resource.task_queue.submit(@task)
          end
        end
      end
    end
    
    class Task < Redcar::Task
      def initialize(resource)
        @resource = resource
      end
      
      def execute
        result = @resource.block.call
        @resource.send(:set_value_from_background, result)
        result
      end
    end
    
    private
    
    def set_value_from_background(value)
      @mutex.synchronize do
        @value  = value
        @future = nil
        @task   = nil
      end
    end
  end
end

Version data entries

37 entries across 37 versions & 2 rubygems

Version Path
redcar-0.13 plugins/core/lib/core/resource.rb
redcar-dev-0.13.5dev plugins/core/lib/core/resource.rb
redcar-dev-0.13.4dev plugins/core/lib/core/resource.rb
redcar-dev-0.13.3dev plugins/core/lib/core/resource.rb
redcar-dev-0.13.2dev plugins/core/lib/core/resource.rb
redcar-dev-0.13.1dev plugins/core/lib/core/resource.rb
redcar-0.12.1 plugins/core/lib/core/resource.rb
redcar-dev-0.13.0dev plugins/core/lib/core/resource.rb
redcar-0.12 plugins/core/lib/core/resource.rb
redcar-dev-0.12.27dev plugins/core/lib/core/resource.rb
redcar-dev-0.12.26dev plugins/core/lib/core/resource.rb
redcar-dev-0.12.25dev plugins/core/lib/core/resource.rb
redcar-dev-0.12.24dev plugins/core/lib/core/resource.rb
redcar-dev-0.12.23dev plugins/core/lib/core/resource.rb
redcar-dev-0.12.22dev plugins/core/lib/core/resource.rb
redcar-dev-0.12.21dev plugins/core/lib/core/resource.rb
redcar-dev-0.12.20dev plugins/core/lib/core/resource.rb
redcar-dev-0.12.19dev plugins/core/lib/core/resource.rb
redcar-dev-0.12.18dev plugins/core/lib/core/resource.rb
redcar-dev-0.12.17dev plugins/core/lib/core/resource.rb