@@ -35,12 +35,24 @@ cluster.isWorker = ('NODE_UNIQUE_ID' in process.env);
35
35
cluster . isMaster = ( cluster . isWorker === false ) ;
36
36
37
37
38
- function Worker ( ) {
39
- if ( ! ( this instanceof Worker ) ) return new Worker ;
38
+ function Worker ( options ) {
39
+ if ( ! ( this instanceof Worker ) )
40
+ return new Worker ( options ) ;
41
+
40
42
EventEmitter . call ( this ) ;
43
+
44
+ if ( ! util . isObject ( options ) )
45
+ options = { } ;
46
+
41
47
this . suicide = undefined ;
42
- this . state = 'none' ;
43
- this . id = 0 ;
48
+ this . state = options . state || 'none' ;
49
+ this . id = options . id | 0 ;
50
+
51
+ if ( options . process ) {
52
+ this . process = options . process ;
53
+ this . process . on ( 'error' , this . emit . bind ( this , 'error' ) ) ;
54
+ this . process . on ( 'message' , this . emit . bind ( this , 'message' ) ) ;
55
+ }
44
56
}
45
57
util . inherits ( Worker , EventEmitter ) ;
46
58
@@ -190,26 +202,6 @@ if (cluster.isMaster)
190
202
else
191
203
workerInit ( ) ;
192
204
193
-
194
- function createWorkerExecArgv ( masterExecArgv , worker ) {
195
- var args = masterExecArgv . slice ( ) ;
196
- var debugPort = process . debugPort + worker . id ;
197
- var hasDebugArg = false ;
198
-
199
- for ( var i = 0 ; i < args . length ; i ++ ) {
200
- var match = args [ i ] . match ( / ^ ( - - d e b u g | - - d e b u g - b r k ) ( = \d + ) ? $ / ) ;
201
- if ( ! match ) continue ;
202
- args [ i ] = match [ 1 ] + '=' + debugPort ;
203
- hasDebugArg = true ;
204
- }
205
-
206
- if ( ! hasDebugArg )
207
- args = [ '--debug-port=' + debugPort ] . concat ( args ) ;
208
-
209
- return args ;
210
- }
211
-
212
-
213
205
function masterInit ( ) {
214
206
cluster . workers = { } ;
215
207
@@ -278,21 +270,46 @@ function masterInit() {
278
270
} ) ;
279
271
} ;
280
272
281
- var ids = 0 ;
282
- cluster . fork = function ( env ) {
283
- cluster . setupMaster ( ) ;
284
- var worker = new Worker ;
285
- worker . id = ++ ids ;
273
+ function createWorkerProcess ( id , env ) {
286
274
var workerEnv = util . _extend ( { } , process . env ) ;
275
+ var execArgv = cluster . settings . execArgv . slice ( ) ;
276
+ var debugPort = process . debugPort + id ;
277
+ var hasDebugArg = false ;
278
+
287
279
workerEnv = util . _extend ( workerEnv , env ) ;
288
- workerEnv . NODE_UNIQUE_ID = '' + worker . id ;
289
- worker . process = fork ( cluster . settings . exec , cluster . settings . args , {
280
+ workerEnv . NODE_UNIQUE_ID = '' + id ;
281
+
282
+ for ( var i = 0 ; i < execArgv . length ; i ++ ) {
283
+ var match = execArgv [ i ] . match ( / ^ ( - - d e b u g | - - d e b u g - b r k ) ( = \d + ) ? $ / ) ;
284
+
285
+ if ( match ) {
286
+ execArgv [ i ] = match [ 1 ] + '=' + debugPort ;
287
+ hasDebugArg = true ;
288
+ }
289
+ }
290
+
291
+ if ( ! hasDebugArg )
292
+ execArgv = [ '--debug-port=' + debugPort ] . concat ( execArgv ) ;
293
+
294
+ return fork ( cluster . settings . exec , cluster . settings . args , {
290
295
env : workerEnv ,
291
296
silent : cluster . settings . silent ,
292
- execArgv : createWorkerExecArgv ( cluster . settings . execArgv , worker ) ,
297
+ execArgv : execArgv ,
293
298
gid : cluster . settings . gid ,
294
299
uid : cluster . settings . uid
295
300
} ) ;
301
+ }
302
+
303
+ var ids = 0 ;
304
+
305
+ cluster . fork = function ( env ) {
306
+ cluster . setupMaster ( ) ;
307
+ var id = ++ ids ;
308
+ var workerProcess = createWorkerProcess ( id , env ) ;
309
+ var worker = new Worker ( {
310
+ id : id ,
311
+ process : workerProcess
312
+ } ) ;
296
313
worker . process . once ( 'exit' , function ( exitCode , signalCode ) {
297
314
worker . suicide = ! ! worker . suicide ;
298
315
worker . state = 'dead' ;
@@ -307,8 +324,6 @@ function masterInit() {
307
324
cluster . emit ( 'disconnect' , worker ) ;
308
325
delete cluster . workers [ worker . id ] ;
309
326
} ) ;
310
- worker . process . on ( 'error' , worker . emit . bind ( worker , 'error' ) ) ;
311
- worker . process . on ( 'message' , worker . emit . bind ( worker , 'message' ) ) ;
312
327
worker . process . on ( 'internalMessage' , internal ( worker , onmessage ) ) ;
313
328
process . nextTick ( function ( ) {
314
329
cluster . emit ( 'fork' , worker ) ;
@@ -447,20 +462,19 @@ function workerInit() {
447
462
448
463
// Called from src/node.js
449
464
cluster . _setupWorker = function ( ) {
450
- var worker = new Worker ;
465
+ var worker = new Worker ( {
466
+ id : + process . env . NODE_UNIQUE_ID | 0 ,
467
+ process : process ,
468
+ state : 'online'
469
+ } ) ;
451
470
cluster . worker = worker ;
452
- worker . id = + process . env . NODE_UNIQUE_ID | 0 ;
453
- worker . state = 'online' ;
454
- worker . process = process ;
455
471
process . once ( 'disconnect' , function ( ) {
456
472
if ( ! worker . suicide ) {
457
473
// Unexpected disconnect, master exited, or some such nastiness, so
458
474
// worker exits immediately.
459
475
process . exit ( 0 ) ;
460
476
}
461
477
} ) ;
462
- worker . process . on ( 'error' , worker . emit . bind ( worker , 'error' ) ) ;
463
- worker . process . on ( 'message' , worker . emit . bind ( worker , 'message' ) ) ;
464
478
process . on ( 'internalMessage' , internal ( worker , onmessage ) ) ;
465
479
send ( { act : 'online' } ) ;
466
480
function onmessage ( message , handle ) {
0 commit comments