Class: Xlogin::SessionPool

Inherits:
Object
  • Object
show all
Defined in:
lib/xlogin/session_pool.rb

Constant Summary collapse

DEFAULT_POOL_SIZE =
1
DEFAULT_POOL_IDLE =
60

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(args, **opts) ⇒ SessionPool



12
13
14
15
16
17
18
19
20
21
22
# File 'lib/xlogin/session_pool.rb', line 12

def initialize(args, **opts)
  @args = args
  @opts = opts

  @size = DEFAULT_POOL_SIZE
  @idle = DEFAULT_POOL_IDLE

  @mutex = Mutex.new
  @queue = Queue.new
  @created  = 0
end

Instance Attribute Details

#idleObject

Returns the value of attribute idle.



10
11
12
# File 'lib/xlogin/session_pool.rb', line 10

def idle
  @idle
end

#sizeObject

Returns the value of attribute size.



10
11
12
# File 'lib/xlogin/session_pool.rb', line 10

def size
  @size
end

Instance Method Details

#closeObject



39
40
41
42
43
44
# File 'lib/xlogin/session_pool.rb', line 39

def close
  while @queue.empty?
    session, _, _ = @queue.deq
    destroy(session)
  end
end

#deqObject



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/xlogin/session_pool.rb', line 46

def deq
  @mutex.synchronize do
    if @queue.empty? && @created < @size
      @created += 1
      return Xlogin.get(@args, **@opts)
    end
  end

  session, created, cleaner = @queue.deq
  if Time.now - created > @idle
    destroy(session)
    return deq
  end

  begin
    raise IOError if session.sock.closed?
  rescue IOError, EOFError, Errno::ECONNABORTED, Errno::ECONNREFUSED, Errno::ECONNRESET
    destroy(session)
    session = deq
  end

  session
end

#destroy(session) ⇒ Object



80
81
82
83
84
85
# File 'lib/xlogin/session_pool.rb', line 80

def destroy(session)
  @mutex.synchronize do
    session.close rescue nil
    @created -= 1
  end
end

#enq(session) ⇒ Object



70
71
72
73
74
75
76
77
78
# File 'lib/xlogin/session_pool.rb', line 70

def enq(session)
  created = Time.now
  cleaner = Thread.new(session) do |s|
    sleep @idle * 1.5
    s.close rescue nil
  end

  @queue.enq [session, created, cleaner]
end

#withObject



32
33
34
35
36
37
# File 'lib/xlogin/session_pool.rb', line 32

def with
  session = deq
  Thread.handle_interrupt(Exception => :immediate) { yield session }
ensure
  enq session
end