mirror of
https://github.com/nodejs/node.git
synced 2024-12-01 16:10:02 +01:00
9949fbda46
Heap dumps can be taken either through the inspector or the public API for it during an async_hooks init() hook, but at that point the AsyncWrap in question is not done initializing yet and virtual methods cannot be called on it. Address this issue (somewhat hackily) by excluding `AsyncWrap` instances which have not yet executed their `init()` hook fully from heap dumps. Fixes: https://github.com/nodejs/node/issues/28786 PR-URL: https://github.com/nodejs/node/pull/28789 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Rich Trott <rtrott@gmail.com>
47 lines
1.0 KiB
JavaScript
47 lines
1.0 KiB
JavaScript
// Flags: --expose-gc
|
||
'use strict';
|
||
const common = require('../common');
|
||
const assert = require('assert');
|
||
const async_hooks = require('async_hooks');
|
||
const v8 = require('v8');
|
||
|
||
// Regression test for https://github.com/nodejs/node/issues/28786
|
||
// Make sure that creating a heap snapshot inside an async_hooks hook
|
||
// works for Promises.
|
||
|
||
const createSnapshot = common.mustCall(() => {
|
||
v8.getHeapSnapshot().resume();
|
||
}, 8); // 2 × init + 2 × resolve + 1 × (after + before) + 2 × destroy = 8 calls
|
||
|
||
const promiseIds = [];
|
||
|
||
async_hooks.createHook({
|
||
init(id, type) {
|
||
if (type === 'PROMISE') {
|
||
createSnapshot();
|
||
promiseIds.push(id);
|
||
}
|
||
},
|
||
|
||
before(id) {
|
||
if (promiseIds.includes(id)) createSnapshot();
|
||
},
|
||
|
||
after(id) {
|
||
if (promiseIds.includes(id)) createSnapshot();
|
||
},
|
||
|
||
promiseResolve(id) {
|
||
assert(promiseIds.includes(id));
|
||
createSnapshot();
|
||
},
|
||
|
||
destroy(id) {
|
||
if (promiseIds.includes(id)) createSnapshot();
|
||
}
|
||
}).enable();
|
||
|
||
|
||
Promise.resolve().then(() => {});
|
||
setImmediate(global.gc);
|