perf_hooks: remove GC callbacks on zero observers count

When all existed PerformanceObserver instances removed for type `gc` GC
callbacks should be removed.

PR-URL: https://github.com/nodejs/node/pull/29444
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Minwoo Jung <minwoo@nodesource.com>
This commit is contained in:
Kirill Fomichev 2019-09-04 23:54:01 +03:00 committed by Rich Trott
parent bbcbce6071
commit 6d01f1fa41
2 changed files with 34 additions and 16 deletions

View file

@ -15,7 +15,8 @@ const {
timeOriginTimestamp,
timerify,
constants,
setupGarbageCollectionTracking
installGarbageCollectionTracking,
removeGarbageCollectionTracking
} = internalBinding('performance');
const {
@ -281,8 +282,6 @@ class PerformanceObserverEntryList {
}
}
let gcTrackingIsEnabled = false;
class PerformanceObserver extends AsyncResource {
constructor(callback) {
if (typeof callback !== 'function') {
@ -319,6 +318,7 @@ class PerformanceObserver extends AsyncResource {
}
disconnect() {
const observerCountsGC = observerCounts[NODE_PERFORMANCE_ENTRY_TYPE_GC];
const types = this[kTypes];
const keys = Object.keys(types);
for (var n = 0; n < keys.length; n++) {
@ -329,6 +329,10 @@ class PerformanceObserver extends AsyncResource {
}
}
this[kTypes] = {};
if (observerCountsGC === 1 &&
observerCounts[NODE_PERFORMANCE_ENTRY_TYPE_GC] === 0) {
removeGarbageCollectionTracking();
}
}
observe(options) {
@ -342,12 +346,8 @@ class PerformanceObserver extends AsyncResource {
if (entryTypes.length === 0) {
throw new ERR_VALID_PERFORMANCE_ENTRY_TYPE();
}
if (entryTypes.includes(NODE_PERFORMANCE_ENTRY_TYPE_GC) &&
!gcTrackingIsEnabled) {
setupGarbageCollectionTracking();
gcTrackingIsEnabled = true;
}
this.disconnect();
const observerCountsGC = observerCounts[NODE_PERFORMANCE_ENTRY_TYPE_GC];
this[kBuffer][kEntries] = [];
L.init(this[kBuffer][kEntries]);
this[kBuffering] = Boolean(options.buffered);
@ -359,6 +359,10 @@ class PerformanceObserver extends AsyncResource {
L.append(list, item);
observerCounts[entryType]++;
}
if (observerCountsGC === 0 &&
observerCounts[NODE_PERFORMANCE_ENTRY_TYPE_GC] === 1) {
installGarbageCollectionTracking();
}
}
}