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