| 'use strict'; |
| |
| const common = require('../common'); |
| const assert = require('assert'); |
| const fs = require('fs/promises'); |
| const { scheduler } = require('timers/promises'); |
| const { parentPort, Worker } = require('worker_threads'); |
| |
| const MAX_ITERATIONS = 5; |
| const MAX_THREADS = 6; |
| |
| // Do not use isMainThread so that this test itself can be run inside a Worker. |
| if (!process.env.HAS_STARTED_WORKER) { |
| process.env.HAS_STARTED_WORKER = 1; |
| |
| function spinWorker(iter) { |
| const w = new Worker(__filename); |
| w.on('message', common.mustCall((msg) => { |
| assert.strictEqual(msg, 'terminate'); |
| w.terminate(); |
| })); |
| |
| w.on('exit', common.mustCall(() => { |
| if (iter < MAX_ITERATIONS) |
| spinWorker(++iter); |
| })); |
| } |
| |
| for (let i = 0; i < MAX_THREADS; i++) { |
| spinWorker(0); |
| } |
| } else { |
| async function open_close() { |
| const fh = await fs.open(__filename); |
| await fh.close(); |
| await scheduler.yield(); |
| await open_close(); |
| } |
| |
| // These async function calls never return as they are meant to continually |
| // open and close files until the worker is terminated. |
| open_close(); |
| open_close(); |
| |
| parentPort.postMessage('terminate'); |
| } |