lib/aerospike/utils/pool.rb in aerospike-2.7.0 vs lib/aerospike/utils/pool.rb in aerospike-2.8.0

- old
+ new

@@ -1,7 +1,7 @@ -# encoding: utf-8 -# Copyright 2014-2017 Aerospike, Inc. +# frozen_string_literal: true +# Copyright 2014-2018 Aerospike, Inc. # # Portions may be licensed to Aerospike, Inc. under one or more contributor # license agreements. # # Licensed under the Apache License, Version 2.0 (the "License"); you may not @@ -14,38 +14,44 @@ # License for the specific language governing permissions and limitations under # the License. module Aerospike - private - class Pool #:nodoc: - attr_accessor :create_block, :cleanup_block + attr_accessor :create_proc, :cleanup_proc, :check_proc def initialize(max_size = 256, &block) - @create_block = block - @cleanup_block = nil + @create_proc = block + @cleanup_proc = nil + @check_proc = nil @pool = Queue.new @max_size = max_size end def offer(obj) if @pool.length < @max_size @pool << obj - elsif @cleanup_block - @cleanup_block.call(obj) + else + cleanup(obj) end end alias_method :<<, :offer def poll(create_new=true) non_block = true - @pool.pop(non_block) - rescue - @create_block.call() if @create_block && create_new + begin + obj = @pool.pop(non_block) + if !check(obj) + cleanup(obj) + obj = nil + end + end until obj + obj + rescue ThreadError + create if create_new end def empty? @pool.length == 0 end @@ -55,9 +61,26 @@ end alias_method :size, :length def inspect "#<Aerospike::Pool: size=#{size}>" + end + + protected + + def create + return unless create_proc + create_proc.() + end + + def check(obj) + return true unless check_proc + check_proc.(obj) + end + + def cleanup(obj) + return unless cleanup_proc + cleanup_proc.(obj) end end end