1'use strict'; 2 3// Ref: https://github.com/nodejs/node/issues/32106 4 5const common = require('../common'); 6 7const assert = require('assert'); 8const cluster = require('cluster'); 9const os = require('os'); 10 11if (cluster.isPrimary) { 12 const workers = []; 13 const numCPUs = os.availableParallelism(); 14 let waitOnline = numCPUs; 15 for (let i = 0; i < numCPUs; i++) { 16 const worker = cluster.fork(); 17 workers[i] = worker; 18 worker.once('online', common.mustCall(() => { 19 if (--waitOnline === 0) 20 for (const worker of workers) 21 if (worker.isConnected()) 22 worker.send(i % 2 ? 'disconnect' : 'destroy'); 23 })); 24 25 // These errors can occur due to the nature of the test, we might be trying 26 // to send messages when the worker is disconnecting. 27 worker.on('error', (err) => { 28 assert.strictEqual(err.syscall, 'write'); 29 if (common.isOSX) { 30 assert(['EPIPE', 'ENOTCONN'].includes(err.code), err); 31 } else { 32 assert(['EPIPE', 'ECONNRESET'].includes(err.code), err); 33 } 34 }); 35 36 worker.once('disconnect', common.mustCall(() => { 37 for (const worker of workers) 38 if (worker.isConnected()) 39 worker.send('disconnect'); 40 })); 41 42 worker.once('exit', common.mustCall((code, signal) => { 43 assert.strictEqual(code, 0); 44 assert.strictEqual(signal, null); 45 })); 46 } 47} else { 48 process.on('message', (msg) => { 49 if (cluster.worker.isConnected()) 50 cluster.worker[msg](); 51 }); 52} 53