@@ -23,30 +23,46 @@ var Log = require('../lib/logger'),
23
23
logLevel ,
24
24
tunnel ;
25
25
26
- function cleanUp ( signal ) {
27
- try {
28
- server . close ( ) ;
29
- } catch ( e ) {
30
- logger . debug ( "Server already closed" ) ;
31
- }
32
-
33
- logger . info ( "Exiting" ) ;
34
-
35
- for ( var key in workers ) {
36
- var worker = workers [ key ] ;
37
- if ( workers . hasOwnProperty ( key ) ) {
38
- client . terminateWorker ( worker . id , function ( ) {
39
- if ( ! workers [ key ] ) {
40
- return ;
41
- }
42
-
26
+ function terminateAllWorkers ( callback ) {
27
+ var cleanWorker = function ( id , key ) {
28
+ client . terminateWorker ( id , function ( ) {
29
+ var worker = workers [ key ] ;
30
+ if ( worker ) {
43
31
logger . debug ( '[%s] Terminated' , worker . string ) ;
44
32
clearTimeout ( worker . activityTimeout ) ;
45
33
delete workers [ key ] ;
46
34
delete workerKeys [ worker . id ] ;
47
- } ) ;
35
+ }
36
+ if ( utils . objectSize ( workers ) === 0 ) {
37
+ callback ( ) ;
38
+ }
39
+ } ) ;
40
+ } ;
41
+
42
+ if ( utils . objectSize ( workers ) === 0 ) {
43
+ callback ( ) ;
44
+ } else {
45
+ for ( var key in workers ) {
46
+ var worker = workers [ key ] ;
47
+ if ( worker . id ) {
48
+ cleanWorker ( worker . id , key ) ;
49
+ } else {
50
+ delete workers [ key ] ;
51
+ if ( utils . objectSize ( workers ) === 0 ) {
52
+ callback ( ) ;
53
+ }
54
+ }
48
55
}
49
56
}
57
+ } ;
58
+
59
+ function cleanUpAndExit ( signal , status ) {
60
+ try {
61
+ server . close ( ) ;
62
+ } catch ( e ) {
63
+ logger . debug ( "Server already closed" ) ;
64
+ }
65
+
50
66
if ( statusPoller ) statusPoller . stop ( ) ;
51
67
52
68
try {
@@ -59,8 +75,15 @@ function cleanUp(signal) {
59
75
} catch ( e ) {
60
76
logger . debug ( "Non existent pid file." ) ;
61
77
}
62
- if ( signal ) {
63
- process . kill ( process . pid , 'SIGTERM' ) ;
78
+
79
+ if ( signal == 'SIGTERM' ) {
80
+ logger . info ( "Exiting" ) ;
81
+ process . exit ( status ) ;
82
+ } else {
83
+ terminateAllWorkers ( function ( ) {
84
+ logger . info ( "Exiting" ) ;
85
+ process . exit ( 1 ) ;
86
+ } ) ;
64
87
}
65
88
}
66
89
@@ -187,7 +210,7 @@ var statusPoller = {
187
210
config . status = 1 ;
188
211
}
189
212
190
- process . exit ( config . status ) ;
213
+ process . kill ( process . pid , 'SIGTERM' ) ;
191
214
}
192
215
}
193
216
} , activityTimeout * 1000 ) ;
@@ -208,7 +231,7 @@ var statusPoller = {
208
231
config . status = 1 ;
209
232
}
210
233
211
- process . exit ( config . status ) ;
234
+ process . kill ( process . pid , 'SIGTERM' ) ;
212
235
}
213
236
}
214
237
} , ( activityTimeout * 1000 ) ) ;
@@ -262,8 +285,8 @@ try {
262
285
runTests ( ) ;
263
286
var pid_file = process . cwd ( ) + '/browserstack-run.pid' ;
264
287
fs . writeFileSync ( pid_file , process . pid , 'utf-8' )
265
- process . on ( 'exit ' , function ( ) { cleanUp ( false ) } ) ;
266
- process . on ( 'SIGINT ' , function ( ) { cleanUp ( true ) } ) ;
288
+ process . on ( 'SIGINT ' , function ( ) { cleanUpAndExit ( 'SIGINT' , 1 ) } ) ;
289
+ process . on ( 'SIGTERM ' , function ( ) { cleanUpAndExit ( 'SIGTERM' , config . status ) } ) ;
267
290
}
268
291
} catch ( e ) {
269
292
console . log ( e ) ;
0 commit comments