Bug 1256472 - Make ShutdownLeaksCollector do more aggressive GCing and CCing to avoid erroneous shutdown leak reports in tests. r?mccr8 draft
authorMike Conley <mconley@mozilla.com>
Sat, 18 Mar 2017 12:48:42 -0400
changeset 502323 e32025cfd42aa58baedec2b6e16629cba4002543
parent 502322 ab383ce6e84b51955d9b689b33a3583e76a9f225
child 550135 19056347c213cf726c9dfab7ca22c52d3c44d82e
push id50256
push usermconley@mozilla.com
push dateTue, 21 Mar 2017 17:20:57 +0000
reviewersmccr8
bugs1256472
milestone55.0a1
Bug 1256472 - Make ShutdownLeaksCollector do more aggressive GCing and CCing to avoid erroneous shutdown leak reports in tests. r?mccr8 With bug 1256472 fixed, we have greater probability of out-of-process browsers being in the midst of teardown and destruction when tests complete. There's already TabDestroyObserver in the parent process making sure that the TabParent's are properly cleaned up, but we need to be more aggressive about clearing out remaining nsIDOMWindow's and DocShells in the content processes. This change more or less mirrors what's already going on in browser-test.js. MozReview-Commit-ID: FZnNLpbfTEY
testing/mochitest/ShutdownLeaksCollector.jsm
--- a/testing/mochitest/ShutdownLeaksCollector.jsm
+++ b/testing/mochitest/ShutdownLeaksCollector.jsm
@@ -2,16 +2,17 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 var Ci = Components.interfaces;
 var Cc = Components.classes;
 var Cu = Components.utils;
 
 Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/Timer.jsm");
 
 this.EXPORTED_SYMBOLS = ["ContentCollector"];
 
 // This listens for the message "browser-test:collect-request". When it gets it,
 // it runs some GCs and CCs, then prints out a message indicating the collections
 // are complete. Mochitest uses this information to determine when windows and
 // docshells should be destroyed.
 
@@ -31,24 +32,41 @@ var ContentCollector = {
   receiveMessage: function(aMessage) {
     switch (aMessage.name) {
       case "browser-test:collect-request":
         Services.obs.notifyObservers(null, "memory-pressure", "heap-minimize");
 
         Cu.forceGC();
         Cu.forceCC();
 
-        Cu.schedulePreciseShrinkingGC(() => {
-          Cu.forceCC();
+        let shutdownCleanup = aCallback => {
+          Cu.schedulePreciseShrinkingGC(() => {
+            // Run the GC and CC a few times to make sure that as much
+            // as possible is freed.
+            Cu.forceGC();
+            Cu.forceCC();
+            aCallback();
+          });
+        };
 
-          let pid = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime).processID;
-          dump("Completed ShutdownLeaks collections in process " + pid + "\n")});
-
-          let cpmm = Cc["@mozilla.org/childprocessmessagemanager;1"]
-                       .getService(Ci.nsISyncMessageSender);
-          cpmm.removeMessageListener("browser-test:collect-request", this);
+        shutdownCleanup(() => {
+          setTimeout(() => {
+            shutdownCleanup(() => {
+              this.finish();
+            })
+          }, 1000);
+        });
 
         break;
     }
-  }
+  },
+
+  finish() {
+    let pid = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime).processID;
+    dump("Completed ShutdownLeaks collections in process " + pid + "\n");
+
+    let cpmm = Cc["@mozilla.org/childprocessmessagemanager;1"]
+                 .getService(Ci.nsISyncMessageSender);
+    cpmm.removeMessageListener("browser-test:collect-request", this);
+  },
 
 };
 ContentCollector.init();