Files

Rcodetools::Fork

Constants

USAGE_HELP
DEFAULT_SETTINGS

PORT
PWD_FILE

Contains $PWD of rct-fork server. Exists only while running.

Public Class Methods

add_env_args(opts, settings) click to toggle source
    # File lib/rcodetools/fork.rb, line 64
64:   def self.add_env_args(opts, settings)
65:     opts.separator ''
66:     opts.separator 'Process environment options:'
67: 
68:     opts.separator ''
69:     opts.on('-e CODE', 'Execute CODE in parent process.',
70:             'May be specified multiple times.') do |code|
71:       settings[:code] << code
72:     end
73: 
74:     opts.separator ''
75:     opts.on('-I DIRECTORY', 'Adds DIRECTORY to $LOAD_PATH.',
76:             'May be specified multiple times.') do |dir|
77:       settings[:extra_paths] << dir
78:     end
79: 
80:     opts.separator ''
81:     opts.on('-r LIBRARY', 'Require LIBRARY in the parent process.',
82:             'May be specified multiple times.') do |lib|
83:       settings[:requires] << lib
84:     end
85:   end
chdir_fork_directory() click to toggle source
    # File lib/rcodetools/fork_config.rb, line 9
 9:   def self.chdir_fork_directory
10:     if run?
11:       Dir.chdir File.read(PWD_FILE)
12:     else
13:       raise "rct-fork is not running."
14:     end
15:   end
daemonize(io = File.open('/dev/null', 'r+')) click to toggle source
    # File lib/rcodetools/fork.rb, line 87
87:   def self.daemonize(io = File.open('/dev/null', 'r+'))
88:     fork and exit!
89:     Process.setsid
90:     fork and exit!
91: 
92:     STDIN.reopen io
93:     STDOUT.reopen io
94:     STDERR.reopen io
95: 
96:     yield if block_given?
97:   end
parse_client_args(args) click to toggle source
     # File lib/rcodetools/fork.rb, line 99
 99:   def self.parse_client_args(args)
100:     settings = Marshal.load Marshal.dump(DEFAULT_SETTINGS)
101: 
102:     opts = OptionParser.new do |opts|
103:       opts.banner = "Usage: #{$0} [options]\n#{USAGE_HELP}"
104: 
105:       opts.separator ''
106:       opts.on('-p', '--port PORT',
107:               'Listen for connections on PORT.',
108:               "Default: #{settings[:port]}") do |port|
109:         settings[:port] = port.to_i
110:               end
111: 
112:       opts.separator ''
113:       opts.on('-h', '--help', 'You\re looking at it.') do
114:         $stderr.puts opts
115:         exit 1
116:       end
117: 
118:       add_env_args opts, settings
119:     end
120: 
121:     opts.parse! args
122: 
123:     return settings
124:   end
parse_server_args(args) click to toggle source
     # File lib/rcodetools/fork.rb, line 126
126:   def self.parse_server_args(args)
127:     settings = Marshal.load Marshal.dump(DEFAULT_SETTINGS)
128: 
129:     opts = OptionParser.new do |opts|
130:       opts.banner = "Usage: #{$0} [options]\n#{USAGE_HELP}"
131: 
132:       opts.separator ''
133:       opts.on('-p', '--port PORT',
134:               'Listen for connections on PORT.',
135:               "Default: #{settings[:port]}") do |port|
136:         settings[:port] = port.to_i
137:       end
138: 
139:       opts.separator ''
140:       opts.on('-h', '--help', 'You\re looking at it.') do
141:         $stderr.puts opts
142:         exit 1
143:       end
144: 
145:       add_env_args opts, settings
146:     end
147: 
148:     opts.parse! args
149: 
150:     return settings
151:   end
run?() click to toggle source
    # File lib/rcodetools/fork_config.rb, line 21
21:   def self.run?
22:     File.file? PWD_FILE
23:   end
setup_environment(settings) click to toggle source
     # File lib/rcodetools/fork.rb, line 213
213:   def self.setup_environment(settings)
214:     settings[:extra_paths].map! { |dir| dir.split ':' }
215:     settings[:extra_paths].flatten!
216:     settings[:extra_paths].each { |dir| $:.unshift dir }
217: 
218:     begin
219:       settings[:requires].each { |file| require file }
220:       settings[:code].each { |code| eval code, TOPLEVEL_BINDING }
221:     rescue Exception
222:       $@.reject! {|s| s =~ %rcodetools/fork\.rb!}
223:       raise
224:     end
225:   end
start_client(args = ARGV) click to toggle source
     # File lib/rcodetools/fork.rb, line 153
153:   def self.start_client(args = ARGV)
154:     trap 'INT' do exit 1 end # Exit gracefully
155: 
156:     settings = parse_client_args args
157: 
158:     args = Marshal.dump [settings, ARGV]
159: 
160:     socket = TCPSocket.new 'localhost', settings[:port]
161: 
162:     socket.puts args.length
163:     socket.write args
164:     socket.close_write
165: 
166:     until socket.eof?
167:       $stdout.puts socket.gets
168:     end
169:   end
start_server(args = ARGV) click to toggle source
     # File lib/rcodetools/fork.rb, line 171
171:   def self.start_server(args = ARGV)
172:     begin
173:       require 'rubygems'
174:     rescue LoadError
175:     end
176:     write_pwd
177:     settings = parse_server_args args
178:     setup_environment settings
179: 
180:     server = TCPServer.new 'localhost', settings[:port]
181: 
182:     $stderr.puts "#{$0} Running as PID #{$$} on #{settings[:port]}"
183: 
184:     loop do
185:       Thread.new server.accept do |socket|
186:         begin
187:           args_length = socket.gets.to_i
188:           args = socket.read args_length
189:           settings, argv = Marshal.load args
190: 
191:           fork do
192:             daemonize socket do
193:               ARGV.replace argv
194:               setup_environment settings
195:               socket.close
196:             end
197:           end
198: 
199:           socket.close # close my copy.
200:         rescue => e
201:           socket.close if socket
202:         end
203:       end
204:     end
205:   rescue Interrupt, SystemExit
206:     File.unlink PWD_FILE
207:   rescue Exception => e
208:     File.unlink PWD_FILE
209:     puts "Failed to catch #{e.class}:#{e.message}"
210:     puts "\t#{e.backtrace.join "\n\t"}"
211:   end
write_pwd() click to toggle source
    # File lib/rcodetools/fork_config.rb, line 17
17:   def self.write_pwd
18:     open(PWD_FILE, "w"){|f| f.print Dir.pwd }
19:   end

Disabled; run with --debug to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.