1
1
require "spring/boot"
2
2
require "set"
3
3
require "pty"
4
+ require "spring/platform"
4
5
5
6
module Spring
6
7
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
7
15
attr_reader :manager , :watcher , :spring_env , :original_env
8
16
9
17
def initialize ( manager , original_env )
@@ -114,13 +122,9 @@ def preload
114
122
end
115
123
end
116
124
117
- def eager_preload
118
- with_pty { preload }
119
- end
120
-
121
125
def run
122
126
state :running
123
- manager . puts
127
+ manager . puts Process . pid
124
128
125
129
loop do
126
130
IO . select [ manager , @interrupt . first ]
@@ -134,6 +138,7 @@ def run
134
138
end
135
139
136
140
def serve ( client )
141
+ app_started = [ false ]
137
142
log "got client"
138
143
manager . puts
139
144
@@ -153,7 +158,7 @@ def serve(client)
153
158
ActionDispatch ::Reloader . prepare!
154
159
end
155
160
156
- pid = fork {
161
+ start_app ( client , streams , app_started ) {
157
162
IGNORE_SIGNALS . each { |sig | trap ( sig , "DEFAULT" ) }
158
163
trap ( "TERM" , "DEFAULT" )
159
164
@@ -182,24 +187,18 @@ def serve(client)
182
187
183
188
command . call
184
189
}
185
-
186
- disconnect_database
187
- reset_streams
188
-
189
- log "forked #{ pid } "
190
- manager . puts pid
191
-
192
- wait pid , streams , client
193
190
rescue Exception => e
191
+ Kernel . exit if exiting? && e . is_a? ( SystemExit )
192
+
194
193
log "exception: #{ e } "
195
- manager . puts unless pid
194
+ manager . puts unless app_started [ 0 ]
196
195
197
196
if streams && !e . is_a? ( SystemExit )
198
197
print_exception ( stderr , e )
199
198
streams . each ( &:close )
200
199
end
201
200
202
- client . puts ( 1 ) if pid
201
+ client . puts ( 1 ) if app_started [ 0 ]
203
202
client . close
204
203
end
205
204
@@ -280,39 +279,11 @@ def print_exception(stream, error)
280
279
rest . each { |line | stream . puts ( "\t from #{ line } " ) }
281
280
end
282
281
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
-
292
282
def reset_streams
293
283
[ STDOUT , STDERR ] . each { |stream | stream . reopen ( spring_env . log_file ) }
294
284
STDIN . reopen ( "/dev/null" )
295
285
end
296
286
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
-
316
287
private
317
288
318
289
def active_record_configured?
0 commit comments