mirror of
https://github.com/nodejs/node.git
synced 2025-08-15 13:48:44 +02:00
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:
parent
bbcbce6071
commit
6d01f1fa41
2 changed files with 34 additions and 16 deletions
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue