Froze rails gems
[depot.git] / vendor / rails / railties / lib / commands / ncgi / tracker
1 #!/usr/bin/env ruby
2
3 require 'drb'
4 require 'thread'
5
6 def message(s)
7 $stderr.puts "tracker: #{s}" if ENV && ENV["DEBUG_GATEWAY"]
8 end
9
10 class Tracker
11 include DRbUndumped
12
13 def initialize(instances, socket_path)
14 @instances = instances
15 @socket = File.expand_path(socket_path)
16 @active = false
17
18 @listeners = []
19 @instances.times { @listeners << Mutex.new }
20
21 message "using #{@listeners.length} listeners"
22 message "opening socket at #{@socket}"
23
24 @service = DRb.start_service("drbunix://#{@socket}", self)
25 end
26
27 def with_listener
28 message "listener requested"
29
30 mutex = has_lock = index = nil
31 3.times do
32 @listeners.each_with_index do |mutex, index|
33 has_lock = mutex.try_lock
34 break if has_lock
35 end
36 break if has_lock
37 sleep 0.05
38 end
39
40 if has_lock
41 message "obtained listener #{index}"
42 @active = true
43 begin yield index
44 ensure
45 mutex.unlock
46 message "released listener #{index}"
47 end
48 else
49 message "dropping request because no listeners are available!"
50 end
51 end
52
53 def background(check_interval = nil)
54 if check_interval
55 loop do
56 sleep check_interval
57 message "Idle for #{check_interval}, shutting down" unless @active
58 @active = false
59 Kernel.exit 0
60 end
61 else DRb.thread.join
62 end
63 end
64 end
65
66 socket_path = ARGV.shift
67 instances = ARGV.shift.to_i
68 t = Tracker.new(instances, socket_path)
69 t.background(ARGV.first ? ARGV.shift.to_i : 90)