Sha256: f0281e36f750eced5c97a37aefd55acd5e1bc6d25d3868f4f0dc700aa323a168

Contents?: true

Size: 1.26 KB

Versions: 1

Compression:

Stored size: 1.26 KB

Contents

require "pol/version"
# simple yet complicated object pooling
# can be unbounded or not
# can be lazy initalization or not
#
class Pol
  attr_accessor :queue
  attr_accessor :clear_block
  attr_accessor :create_block
  protected :queue

  class Error < StandardError; end
  class CreateBlockNotSupplayed < Error
    def initialize
      super('create block not supplayed')
    end
  end

  def initialize(&block)
    raise CreateBlockNotSupplayed unless block
    self.queue = create_queue
    self.create_block = block
  end

  def with_pool
    begin
      pooled_obj =  pick_from_pool
      yield(pooled_obj) if block_given?
    ensure
      put_to_pool(pooled_obj)
    end
  end

  def set_clear_block(&block)
    self.clear_block = block
  end

  def clear_pool
    if self.clear_block.nil?
      self.queue.clear
      true
    else
      cleared_queue = self.queue
      self.queue = create_queue

      while !cleared_queue.empty?
        cleared_obj = cleared_queue.pop(true)
        self.clear_block.call(cleared_obj)
      end
      true
    end
  end

  private

  def create_queue
    Queue.new
  end

  def pick_from_pool
    begin
      self.queue.pop(true)
    rescue ThreadError
      create_block.call
    end
  end

  def put_to_pool(obj)
    self.queue.push(obj)
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
pol-0.1.0 lib/pol.rb