net-http-persistent usage respects timeouts
[ruby-mogilefs-client.git] / lib / mogilefs / pool.rb
blobe7c40094a650374aacc57e47a35d698e1e156676
1 # -*- encoding: binary -*-
2 require 'thread'
4 class MogileFS::Pool
6   # Must be a positive Integer that is greater than :purge_keep
7   # Default: 5
8   attr_accessor :purge_threshold
10   # Must be a positive Integer that is smaller than :purge_threshold
11   # Default: 2
12   attr_accessor :purge_keep
14   class BadObjectError < RuntimeError; end
16   def initialize(klass, *args)
17     @args = args
18     @klass = klass
19     @queue = Queue.new
20     @objects = {}
21     @purge_threshold = 5
22     @purge_keep = 2
23   end
25   def get
26     @queue.pop true
27   rescue ThreadError
28     object = @klass.new(*@args)
29     @objects[object] = object
30   end
32   def put(o)
33     raise BadObjectError unless @objects.include? o
34     @queue.push o
35     purge
36   end
38   def use
39     object = get
40     yield object
41     nil
42   ensure
43     put object
44     nil
45   end
47   def purge
48     return if @queue.length < @purge_threshold
49     begin
50       until @queue.length <= @purge_keep
51         obj = @queue.pop true
52         @objects.delete obj
53         obj.backend.shutdown if MogileFS::Client === obj
54       end
55     rescue ThreadError
56     end
57   end
59 end