| 'use strict'; |
| const common = require('../common'); |
| if (!common.hasCrypto) |
| common.skip('missing crypto'); |
| |
| const assert = require('assert'); |
| const http2 = require('http2'); |
| const { Duplex } = require('stream'); |
| const { Worker, workerData } = require('worker_threads'); |
| |
| // Tests the interaction between terminating a Worker thread and running |
| // the native SetImmediate queue, which may attempt to perform multiple |
| // calls into JS even though one already terminates the Worker. |
| |
| if (!workerData) { |
| const counter = new Int32Array(new SharedArrayBuffer(4)); |
| const worker = new Worker(__filename, { workerData: { counter } }); |
| worker.on('exit', common.mustCall(() => { |
| assert.strictEqual(counter[0], 1); |
| })); |
| } else { |
| const { counter } = workerData; |
| |
| // Start two HTTP/2 connections. This will trigger write()s call from inside |
| // the SetImmediate queue. |
| for (let i = 0; i < 2; i++) { |
| http2.connect('http://localhost', { |
| createConnection() { |
| return new Duplex({ |
| write(chunk, enc, cb) { |
| Atomics.add(counter, 0, 1); |
| process.exit(); |
| }, |
| read() { } |
| }); |
| } |
| }); |
| } |
| } |