11require "spring/boot"
22require "set"
33require "pty"
4+ require "spring/platform"
45
56module Spring
67 class Application
8+ if Spring . fork?
9+ require 'spring/application/fork_strategy'
10+ include ForkStrategy
11+ else
12+ require 'spring/application/pool_strategy'
13+ include PoolStrategy
14+ end
715 attr_reader :manager , :watcher , :spring_env , :original_env
816
917 def initialize ( manager , original_env )
@@ -114,13 +122,9 @@ def preload
114122 end
115123 end
116124
117- def eager_preload
118- with_pty { preload }
119- end
120-
121125 def run
122126 state :running
123- manager . puts
127+ manager . puts Process . pid
124128
125129 loop do
126130 IO . select [ manager , @interrupt . first ]
@@ -134,6 +138,7 @@ def run
134138 end
135139
136140 def serve ( client )
141+ child_started = [ false ]
137142 log "got client"
138143 manager . puts
139144
@@ -153,7 +158,7 @@ def serve(client)
153158 ActionDispatch ::Reloader . prepare!
154159 end
155160
156- pid = fork {
161+ fork_child ( client , streams , child_started ) {
157162 IGNORE_SIGNALS . each { |sig | trap ( sig , "DEFAULT" ) }
158163 trap ( "TERM" , "DEFAULT" )
159164
@@ -182,24 +187,18 @@ def serve(client)
182187
183188 command . call
184189 }
185-
186- disconnect_database
187- reset_streams
188-
189- log "forked #{ pid } "
190- manager . puts pid
191-
192- wait pid , streams , client
193190 rescue Exception => e
191+ Kernel . exit if exiting? && e . is_a? ( SystemExit )
192+
194193 log "exception: #{ e } "
195- manager . puts unless pid
194+ manager . puts unless child_started [ 0 ]
196195
197196 if streams && !e . is_a? ( SystemExit )
198197 print_exception ( stderr , e )
199198 streams . each ( &:close )
200199 end
201200
202- client . puts ( 1 ) if pid
201+ client . puts ( 1 ) if child_started [ 0 ]
203202 client . close
204203 end
205204
@@ -280,39 +279,11 @@ def print_exception(stream, error)
280279 rest . each { |line | stream . puts ( "\t from #{ line } " ) }
281280 end
282281
283- def with_pty
284- PTY . open do |master , slave |
285- [ STDOUT , STDERR , STDIN ] . each { |s | s . reopen slave }
286- Thread . new { master . read }
287- yield
288- reset_streams
289- end
290- end
291-
292282 def reset_streams
293283 [ STDOUT , STDERR ] . each { |stream | stream . reopen ( spring_env . log_file ) }
294284 STDIN . reopen ( "/dev/null" )
295285 end
296286
297- def wait ( pid , streams , client )
298- @mutex . synchronize { @waiting << pid }
299-
300- # Wait in a separate thread so we can run multiple commands at once
301- Thread . new {
302- begin
303- _ , status = Process . wait2 pid
304- log "#{ pid } exited with #{ status . exitstatus } "
305-
306- streams . each ( &:close )
307- client . puts ( status . exitstatus )
308- client . close
309- ensure
310- @mutex . synchronize { @waiting . delete pid }
311- exit_if_finished
312- end
313- }
314- end
315-
316287 private
317288
318289 def active_record_configured?
0 commit comments