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+       app_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+       start_app ( client ,   streams ,   app_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  app_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  app_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 } #{ 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