// Copyright 2018 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Flags: --expose-gc --noincremental-marking // Flags: --no-stress-flush-code let cleanup0_call_count = 0; let cleanup0_holdings_count = 0; let cleanup1_call_count = 0; let cleanup1_holdings_count = 0; let cleanup0 = function(holdings) { ++cleanup0_holdings_count; ++cleanup0_call_count; } let cleanup1 = function(holdings) { ++cleanup1_holdings_count; ++cleanup1_call_count; } let fg0 = new FinalizationRegistry(cleanup0); let fg1 = new FinalizationRegistry(cleanup1); // Register 1 weak reference for each FinalizationRegistry and kill the objects they point to. (function() { // The objects need to be inside a closure so that we can reliably kill them. let objects = []; objects[0] = {}; objects[1] = {}; fg0.register(objects[0], "holdings0-0"); fg1.register(objects[1], "holdings1-0"); // Drop the references to the objects. objects = []; })(); // Will schedule both fg0 and fg1 for cleanup. gc(); // Before the cleanup task has a chance to run, do the same thing again, so both // FinalizationRegistries are (again) scheduled for cleanup. This has to be a IIFE function // (so that we can reliably kill the objects) so we cannot use the same function // as before. (function() { let objects = []; objects[0] = {}; objects[1] = {}; fg0.register(objects[0], "holdings0-1"); fg1.register(objects[1], "holdings1-1"); objects = []; })(); gc(); let timeout_func = function() { assertEquals(2, cleanup0_call_count); assertEquals(2, cleanup0_holdings_count); assertEquals(2, cleanup1_call_count); assertEquals(2, cleanup1_holdings_count); } // Give the cleanup task a chance to run. setTimeout(timeout_func, 0);