class RBThreadPool::RBThreadDaemon

Attributes

condition[RW]
daemon_th[R]

Public Class Methods

new(mutex, common_pool, elastic, manager, config = {}) click to toggle source
# File lib/core/rb_daemon.rb, line 10
def initialize(mutex, common_pool, elastic, manager, config = {})
  @mutex = mutex
  @config = config
  @interval = config[:interval] || 20
  @pool = common_pool
  @elastic = elastic
  @manager = manager
  @condition = true
  @daemon_th = nil
end

Public Instance Methods

run!() click to toggle source
# File lib/core/rb_daemon.rb, line 21
def run!
  @daemon_th = generate_daemon
end

Private Instance Methods

clean(pool) click to toggle source
# File lib/core/rb_daemon.rb, line 50
def clean(pool)
  size = pool.size
  count_dead = 0
  size.times do |idx|
    unless pool[idx].alive?
      pool[idx] = nil
      count_dead += 1
    end
  end
  return count_dead if count_dead == 0
  pool.compact!
  count_dead
end
clean_common(pool) click to toggle source
# File lib/core/rb_daemon.rb, line 45
def clean_common(pool)
  deads = clean(pool)
  revive_common_thread deads if deads > 0
end
generate_daemon() click to toggle source
# File lib/core/rb_daemon.rb, line 27
def generate_daemon

  return Thread.new do
    Thread.current.name = 'RbThr:Daemon' if Thread.respond_to?(:name=)
    Thread.abort_on_exception = true
    interval = @interval
    mutex = @mutex
    pool = @pool
    elastic = @elastic
    while @condition
      sleep(interval)
      mutex.synchronize { clean_common pool }
      Thread.pass
      mutex.synchronize { clean elastic } unless elastic.nil? || elastic.empty?
    end
  end
end
revive_common_thread(num) click to toggle source
# File lib/core/rb_daemon.rb, line 64
def revive_common_thread(num)
  manager = @manager
  pool = @pool
  num.times do |idx|
    pool << manager.fork
  end
end