class Spring::ApplicationManager::Worker

Attributes

on_done[RW]
pid[R]
screen_name[R]
screen_pid[R]
socket[R]
uuid[R]

Public Class Methods

new(env, args) click to toggle source
# File lib/spring-jruby/impl/pool/application_manager.rb, line 7
def initialize(env, args)
  @spring_env = Env.new
  channel, @remote_socket = WorkerChannel.pair
  @uuid = File.basename(@remote_socket.path).gsub('.sock', '')

  Bundler.with_clean_env do
    spawn_screen(
      env.merge("SPRING_SOCKET" => @remote_socket.path),
      args
    )
  end

  @socket = channel.to_io
end

Public Instance Methods

await_boot() click to toggle source
# File lib/spring-jruby/impl/pool/application_manager.rb, line 35
def await_boot
  Process.detach(screen_pid)
  @pid = socket.gets.to_i
  start_wait_thread(pid, socket) unless pid.zero?
  @remote_socket.close
end
log(message) click to toggle source
# File lib/spring-jruby/impl/pool/application_manager.rb, line 55
def log(message)
  @spring_env.log "[worker:#{uuid}] #{message}"
end
spawn_screen(env, args) click to toggle source
# File lib/spring-jruby/impl/pool/application_manager.rb, line 22
def spawn_screen(env, args)
  @screen_name = "spring_#{@uuid}"

  @screen_pid =
    Process.spawn(
      env.merge("SPRING_SCREEN_NAME" => screen_name),
      "screen", "-d", "-m", "-S", screen_name,
      *args
    )

  log "(spawn #{@screen_pid})"
end
start_wait_thread(pid, child) click to toggle source
# File lib/spring-jruby/impl/pool/application_manager.rb, line 42
def start_wait_thread(pid, child)
  Thread.new {
    begin
      Process.kill(0, pid) while sleep(1)
    rescue Errno::ESRCH
    end

    log "child #{pid} shutdown"

    on_done.call(self) if on_done
  }
end