Sha256: 1063b263cfe428c8c124cd21d36bea46f892c6c85b046b197e7d7c161c8001fe

Contents?: true

Size: 972 Bytes

Versions: 3

Compression:

Stored size: 972 Bytes

Contents

# * George Moschovitis  <gm@navel.gr>
# (c) 2004-2005 Navel, all rights reserved.
# $Id: pool.rb 182 2005-07-22 10:07:50Z gmosx $

require 'thread'
require 'monitor'

module Glue 

# Generalized object pool implementation. Implemented as a thread 
# safe stack. Exclusive locking is needed both for push and pop. 
#
# INVESTIGATE: Could use the SizedQueue/Queue.

class Pool < Array
  include MonitorMixin
  
  def initialize
    super
    @cv = new_cond()
  end

  # Add, restore an object to the pool.
  
  def push(obj)
    synchronize do
      super
      @cv.signal()
    end
  end
  
  # Obtain an object from the pool.
  
  def pop
    synchronize do
      @cv.wait_while { empty? }
      super
    end
  end

  # Obtains an object, passes it to a block for processing
  # and restores it to the pool.

  def obtain
    result = nil
    
    begin
      obj = pop()

      result = yield(obj)
    ensure
      push(obj)
    end

    return result
  end
  
end

end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
glue-0.22.0 lib/glue/pool.rb
glue-0.21.0 lib/glue/pool.rb
glue-0.21.2 lib/glue/pool.rb