Sha256: 07ad8df49d816c0758d2ab2132d4b13ff34d2f4313919ca765c282db20a6acdf

Contents?: true

Size: 907 Bytes

Versions: 6

Compression:

Stored size: 907 Bytes

Contents

# * George Moschovitis  <gm@navel.gr>
# (c) 2004-2005 Navel, all rights reserved.
# $Id: pool.rb 1 2005-04-11 11:04:30Z 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

6 entries across 6 versions & 1 rubygems

Version Path
glue-0.17.0 lib/glue/pool.rb
glue-0.18.0 lib/glue/pool.rb
glue-0.16.0 lib/glue/pool.rb
glue-0.18.1 lib/glue/pool.rb
glue-0.19.0 lib/glue/pool.rb
glue-0.20.0 lib/glue/pool.rb