Source code
Revision control
Copy as Markdown
Other Tools
// Test GC telemetry.
gczeal(0);
gcparam('perZoneGCEnabled', 1);
gcparam('incrementalGCEnabled', 1);
gc();
function runAndGetTelemetry(probe, thunk) {
startRecordingTelemetry(probe);
thunk();
let samples = getTelemetrySamples(probe);
stopRecordingTelemetry(probe);
return samples;
}
function checkTelemetry(probe, expected, thunk) {
let samples = runAndGetTelemetry(probe, thunk);
assertEq(samples.length, 1);
assertEq(samples[0], expected);
}
function incrementalGC() {
startgc(1);
while (gcstate() != 'NotActive') {
gcslice(10000);
}
}
checkTelemetry('GC_IS_COMPARTMENTAL', 0, () => gc());
checkTelemetry('GC_IS_COMPARTMENTAL', 1, () => gc(this));
// By default there are two zones, the one for |this| and this atoms zone.
checkTelemetry('GC_ZONE_COUNT', 2, () => gc());
checkTelemetry('GC_ZONES_COLLECTED', 2, () => gc());
checkTelemetry('GC_ZONES_COLLECTED', 1, () => gc(this));
checkTelemetry('GC_RESET', 0, () => gc());
checkTelemetry('GC_RESET', 0, () => { startgc(1); finishgc(); });
checkTelemetry('GC_RESET', 1, () => { startgc(1); abortgc(); });
checkTelemetry('GC_NON_INCREMENTAL', 1, () => gc());
checkTelemetry('GC_NON_INCREMENTAL', 1, () => { startgc(1); abortgc(); });
checkTelemetry('GC_NON_INCREMENTAL', 0, () => { startgc(1); finishgc(); });
checkTelemetry('GC_NON_INCREMENTAL', 0, () => incrementalGC());
// GC_SLICE_COUNT is not reported for non-incremental GCs.
let samples = runAndGetTelemetry('GC_SLICE_COUNT', () => gc());
assertEq(samples.length, 0);
checkTelemetry('GC_SLICE_COUNT', 2, () => { startgc(1); finishgc(); });