• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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