1'use strict'; 2const common = require('../common'); 3const assert = require('assert'); 4const { once } = require('events'); 5const v8 = require('v8'); 6const { Worker } = require('worker_threads'); 7 8// Verify that Workers don't care about --stack-size, as they have their own 9// fixed and known stack sizes. 10 11async function runWorker(options = {}) { 12 const empiricalStackDepth = new Uint32Array(new SharedArrayBuffer(4)); 13 const worker = new Worker(` 14 const { workerData: { empiricalStackDepth } } = require('worker_threads'); 15 function f() { 16 empiricalStackDepth[0]++; 17 f(); 18 } 19 f();`, { 20 eval: true, 21 workerData: { empiricalStackDepth }, 22 ...options 23 }); 24 25 const [ error ] = await once(worker, 'error'); 26 27 if (!options.skipErrorCheck) { 28 common.expectsError({ 29 constructor: RangeError, 30 message: 'Maximum call stack size exceeded' 31 })(error); 32 } 33 34 return empiricalStackDepth[0]; 35} 36 37(async function() { 38 { 39 v8.setFlagsFromString('--stack-size=500'); 40 const w1stack = await runWorker(); 41 v8.setFlagsFromString('--stack-size=1000'); 42 const w2stack = await runWorker(); 43 // Make sure the two stack sizes are within 10 % of each other, i.e. not 44 // affected by the different `--stack-size` settings. 45 assert(Math.max(w1stack, w2stack) / Math.min(w1stack, w2stack) < 1.1, 46 `w1stack = ${w1stack}, w2stack = ${w2stack} are too far apart`); 47 } 48 49 { 50 const w1stack = await runWorker({ resourceLimits: { stackSizeMb: 0.5 } }); 51 const w2stack = await runWorker({ resourceLimits: { stackSizeMb: 1.0 } }); 52 // Make sure the two stack sizes are at least 40 % apart from each other, 53 // i.e. affected by the different `stackSizeMb` settings. 54 assert(w2stack > w1stack * 1.4, 55 `w1stack = ${w1stack}, w2stack = ${w2stack} are too close`); 56 } 57 58 // Test that various low stack sizes result in an 'error' event. 59 for (const stackSizeMb of [ 0.001, 0.01, 0.1, 0.2, 0.3, 0.5 ]) { 60 await runWorker({ resourceLimits: { stackSizeMb }, skipErrorCheck: true }); 61 } 62})().then(common.mustCall()); 63