Class: Mist::Pool

Inherits:
Object
  • Object
show all
Defined in:
lib/mist/pool.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(mutex) ⇒ Pool

Returns a new instance of Pool.



33
34
35
36
37
38
# File 'lib/mist/pool.rb', line 33

def initialize(mutex)
  @mutex = mutex

  @available = []
  @busy = []
end

Class Method Details

.get(servers) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/mist/pool.rb', line 18

def self.get(servers)
  @@pool ||= nil
  if @@pool.nil?
    @@pool = Pool.new(Mutex.new)
    begin
      servers.each do |server|
        @@pool.add(server)
      end
    rescue StandardError => ex
      Mist.logger.error "couldn't load config file: #{ex}"
    end
  end
  @@pool
end

Instance Method Details

#acquireObject



53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/mist/pool.rb', line 53

def acquire
  server = nil
  # Get the first available client; loop until one becomes available
  loop do
    @mutex.synchronize do
      server = @available.shuffle.pop unless @available.empty?
      @busy.push server unless server.nil?
    end
    break if server
    sleep 1
  end

  return server
end

#add(server) ⇒ Object



40
41
42
43
44
# File 'lib/mist/pool.rb', line 40

def add(server)
  @mutex.synchronize do
    @available << server
  end
end

#release(server) ⇒ Object



68
69
70
71
72
73
74
75
# File 'lib/mist/pool.rb', line 68

def release(server)
  # Put the server back in the available list; if the server was removed
  # while we were using it, don't put it back.
  @mutex.synchronize do
    @available.push server if @busy.include? server
    @busy.delete server if @busy.include? server
  end
end

#remove(server) ⇒ Object



46
47
48
49
50
51
# File 'lib/mist/pool.rb', line 46

def remove(server)
  @mutex.synchronize do
    @available.delete server if @available.include? server
    @busy.delete server if @busy.include? server
  end
end