mirror of https://gitee.com/openkylin/nodejs.git
79 lines
1.8 KiB
JavaScript
79 lines
1.8 KiB
JavaScript
'use strict';
|
|
const common = require('../common');
|
|
|
|
common.skipIfInspectorDisabled();
|
|
|
|
const { Worker, isMainThread, parentPort, workerData } =
|
|
require('worker_threads');
|
|
|
|
if (isMainThread || workerData !== 'launched by test') {
|
|
common.skipIfWorker();
|
|
}
|
|
|
|
const { Session } = require('inspector');
|
|
|
|
const MAX_DEPTH = 3;
|
|
|
|
let rootWorker = null;
|
|
|
|
const runTest = common.mustCall(function() {
|
|
let reportedWorkersCount = 0;
|
|
const session = new Session();
|
|
session.connect();
|
|
session.on('NodeWorker.attachedToWorker', common.mustCall(
|
|
({ params: { workerInfo } }) => {
|
|
console.log(`Worker ${workerInfo.title} was reported`);
|
|
if (++reportedWorkersCount === MAX_DEPTH) {
|
|
rootWorker.postMessage({ done: true });
|
|
}
|
|
}, MAX_DEPTH));
|
|
session.post('NodeWorker.enable', { waitForDebuggerOnStart: false });
|
|
});
|
|
|
|
function processMessage({ child }) {
|
|
console.log(`Worker ${child} is running`);
|
|
if (child === MAX_DEPTH) {
|
|
runTest();
|
|
}
|
|
}
|
|
|
|
function workerCallback(message) {
|
|
parentPort.postMessage(message);
|
|
}
|
|
|
|
function startWorker(depth, messageCallback) {
|
|
const worker = new Worker(__filename, { workerData: 'launched by test' });
|
|
worker.on('message', messageCallback);
|
|
worker.postMessage({ depth });
|
|
return worker;
|
|
}
|
|
|
|
function runMainThread() {
|
|
rootWorker = startWorker(1, processMessage);
|
|
}
|
|
|
|
function runChildWorkerThread() {
|
|
let worker = null;
|
|
parentPort.on('message', ({ child, depth, done }) => {
|
|
if (done) {
|
|
if (worker) {
|
|
worker.postMessage({ done: true });
|
|
}
|
|
parentPort.close();
|
|
} else if (depth) {
|
|
parentPort.postMessage({ child: depth });
|
|
if (depth < MAX_DEPTH) {
|
|
worker = startWorker(depth + 1, workerCallback);
|
|
}
|
|
} else if (child) {
|
|
parentPort.postMessage({ child });
|
|
}
|
|
});
|
|
}
|
|
|
|
if (isMainThread) {
|
|
runMainThread();
|
|
} else {
|
|
runChildWorkerThread();
|
|
}
|