http_file: do not reopen opened file (on retry)
[ruby-mogilefs-client.git] / lib / mogilefs / pool.rb
blob6033adae8a0f108f2ac54694451569a392097c39
1 # -*- encoding: binary -*-
2 require 'thread'
4 class MogileFS::Pool
6   class BadObjectError < RuntimeError; end
8   def initialize(klass, *args)
9     @args = args
10     @klass = klass
11     @queue = Queue.new
12     @objects = []
13   end
15   def get
16     begin
17       object = @queue.pop true
18     rescue ThreadError
19       object = @klass.new(*@args)
20       @objects << object
21     end
22     object
23   end
25   def put(o)
26     raise BadObjectError unless @objects.include? o
27     @queue.push o
28     purge
29   end
31   def use
32     object = get
33     yield object
34     nil
35   ensure
36     put object
37     nil
38   end
40   def purge
41     return if @queue.length < 5
42     begin
43       until @queue.length <= 2 do
44         obj = @queue.pop true
45         @objects.delete obj
46       end
47     rescue ThreadError
48     end
49   end
51 end