0
+ $LOAD_PATH << "#{File.dirname(__FILE__)}/.."
0
require 'mod_rails/framework_spawner'
0
require 'mod_rails/application'
0
require 'mod_rails/message_channel'
0
+require 'mod_rails/core_extensions'
0
module ModRails # :nodoc:
0
+ SPAWNER_CLEAN_INTERVAL = 125
0
+ SPAWNER_MAX_IDLE_TIME = 120
0
+ @previous_signal_handlers = {}
0
+ @cond = ConditionVariable.new
0
+ @cleaner_thread = Thread.new do
0
+ @spawners.each_value do |spawner|
0
def spawn_application(app_root, username = nil)
0
framework_version = Application.get_framework_version(app_root)
0
- spawner = @spawners[framework_version]
0
- spawner = FrameworkSpawner.new(framework_version)
0
- @spawners[framework_version] = spawner
0
+ spawner = @spawners[framework_version]
0
+ spawner = FrameworkSpawner.new(framework_version)
0
+ @spawners[framework_version] = spawner
0
+ spawner.time = Time.now
0
return spawner.spawn_application(app_root, username)
0
def server_main(unix_socket)
0
@channel = MessageChannel.new(unix_socket)
0
install_signal_handlers
0
- name, *args = channel.read
0
+ name, *args = @channel.read
0
+ elsif !MESSAGE_HANDLERS.has_key?(name)
0
+ raise StandardError, "Unknown message '#{name}' received."
0
+ __send__(MESSAGE_HANDLERS[name], *args)
0
- __send__(MESSAGE_HANDLERS[name], *args)
0
+ revert_signal_handlers
0
- @spawners.each_value do |spawner|
0
+ class ExitNow < RuntimeError
0
'spawn_application' => :handle_spawn_application
0
+ def install_signal_handlers
0
+ Signal.list.each_key do |signal|
0
+ prev_handler = trap(signal, 'DEFAULT')
0
+ if prev_handler != 'DEFAULT'
0
+ @previous_signal_handlers[signal] = prev_handler
0
+ # Signal cannot be trapped; ignore it.
0
+ SIGNAL_HANDLERS.each_pair do |signal, handler|
0
+ trap(signal, 'IGNORE')
0
+ def revert_signal_handlers
0
+ @previous_signal_handlers.each_pair do |signal, handler|
0
+ @previous_signal_handlers = {}
0
def handle_spawn_application(app_root, username)
0
app = spawn_application(app_root, username)
0
@@ -52,10 +122,48 @@ private
0
@channel.send_io(app.socket)
0
+ def cleaner_thread_main
0
+ if @cond.timed_wait(@lock, SPAWNER_CLEAN_INTERVAL)
0
+ current_time = Time.now
0
+ @spawners.keys.each do |key|
0
+ spawner = @spawners[key]
0
+ if current_time - spawner.time > SPAWNER_MAX_IDLE_TIME
0
+ raise ExitNow, "Exit requested"
0
+ @spawners.each_each do |spawner|
0
- exit(SpawnManager.new.server_main)
0
+ unix_socket = IO.new(ARGV[0].to_i, "a+")
0
+ spawn_manager = SpawnManager.new
0
+ spawn_manager.server_main(unix_socket)
0
\ No newline at end of file
Comments
No one has commented yet.