Class: Xlogin::SessionPool
- Inherits:
-
Object
- Object
- Xlogin::SessionPool
- Defined in:
- lib/xlogin/session_pool.rb
Constant Summary collapse
- DEFAULT_POOL_SIZE =
1- DEFAULT_POOL_IDLE =
60
Instance Attribute Summary collapse
-
#idle ⇒ Object
Returns the value of attribute idle.
-
#size ⇒ Object
Returns the value of attribute size.
Instance Method Summary collapse
- #close ⇒ Object
- #deq ⇒ Object
- #destroy(session) ⇒ Object
- #enq(session) ⇒ Object
-
#initialize(args, **opts) ⇒ SessionPool
constructor
A new instance of SessionPool.
- #with ⇒ Object
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
#idle ⇒ Object
Returns the value of attribute idle.
10 11 12 |
# File 'lib/xlogin/session_pool.rb', line 10 def idle @idle end |
#size ⇒ Object
Returns the value of attribute size.
10 11 12 |
# File 'lib/xlogin/session_pool.rb', line 10 def size @size end |
Instance Method Details
#close ⇒ Object
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 |
#deq ⇒ Object
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 |
#with ⇒ Object
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 |