From 512def40e821774aa1618519c4a6b61fb8b0b33e Mon Sep 17 00:00:00 2001 From: James M Snell Date: Mon, 26 Apr 2021 06:50:40 -0700 Subject: [PATCH] perf_hooks: fix PerformanceObserver 'gc' crash Signed-off-by: James M Snell Fixes: https://github.com/nodejs/node/issues/38412 --- lib/internal/perf/observe.js | 7 ++++++- test/parallel/test-performanceobserver-gc.js | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 test/parallel/test-performanceobserver-gc.js diff --git a/lib/internal/perf/observe.js b/lib/internal/perf/observe.js index 4d71666882a3ba..c96925c723f64e 100644 --- a/lib/internal/perf/observe.js +++ b/lib/internal/perf/observe.js @@ -72,6 +72,8 @@ const kDeprecationMessage = const kTypeSingle = 0; const kTypeMultiple = 1; +let gcTrackingInstalled = false; + const kSupportedEntryTypes = ObjectFreeze([ 'function', 'gc', @@ -124,8 +126,11 @@ function maybeIncrementObserverCount(type) { if (observerType !== undefined) { observerCounts[observerType]++; - if (observerType === NODE_PERFORMANCE_ENTRY_TYPE_GC) + if (!gcTrackingInstalled && + observerType === NODE_PERFORMANCE_ENTRY_TYPE_GC) { installGarbageCollectionTracking(); + gcTrackingInstalled = true; + } } } diff --git a/test/parallel/test-performanceobserver-gc.js b/test/parallel/test-performanceobserver-gc.js new file mode 100644 index 00000000000000..fe9397631c2d42 --- /dev/null +++ b/test/parallel/test-performanceobserver-gc.js @@ -0,0 +1,17 @@ +'use strict'; + +require('../common'); + +// Verifies that setting up two observers to listen +// to gc performance does not crash. + +const { + PerformanceObserver, +} = require('perf_hooks'); + +// We don't actually care if the callback is ever invoked in this test +const obs = new PerformanceObserver(() => {}); +const obs2 = new PerformanceObserver(() => {}); + +obs.observe({ type: 'gc' }); +obs2.observe({ type: 'gc' });