diff chrome/memory.js @ 206:beca399c3a16

Bug 685632 - Please collect RSS (memory) data during Talos testing on Android. r=jlebar,njn
author Joel Maher <jmaher@mozilla.com>
date Wed, 09 Nov 2011 10:41:03 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/chrome/memory.js	Wed Nov 09 10:41:03 2011 -0500
@@ -0,0 +1,95 @@
+
+var gChildProcess = true;
+var gMemCallback = null;
+
+
+/*
+ * Initialize memory collector.  Determine if we have a child process.
+ */
+function initializeMemoryCollector(callback, args) {
+    gMemCallback = function() { return callback(args); };
+
+    var os = Components.classes["@mozilla.org/observer-service;1"].
+        getService(Components.interfaces.nsIObserverService);
+
+    os.addObserver(function () {
+        var os = Components.classes["@mozilla.org/observer-service;1"].
+            getService(Components.interfaces.nsIObserverService);
+
+        memTimer.cancel();
+        memTimer = null;
+
+        os.removeObserver(arguments.callee, "child-memory-reporter-update", false);
+        os.addObserver(collectAndReport, "child-memory-reporter-update", false);
+        gMemCallback();
+    }, "child-memory-reporter-update", false);
+
+   /*
+    * Assume we have a child process, but if timer fires before we call the observer
+    * we will assume there is no child process.
+    */
+    var event = {
+      notify: function(timer) {
+        memTimer = null;
+        gChildProcess = false;
+        gMemCallback();
+      }
+    }
+ 
+    memTimer = Components.classes["@mozilla.org/timer;1"].createInstance(Components.interfaces.nsITimer);
+    memTimer.initWithCallback(event, 10000, Components.interfaces.nsITimer.TYPE_ONE_SHOT);
+
+    os.notifyObservers(null, "child-memory-reporter-request", null);
+}
+
+/*
+ * Collect memory from all processes and callback when done collecting.
+ */
+function collectMemory(callback, args) {
+  gMemCallback = function() { return callback(args); };
+
+  if (gChildProcess) {
+    var os = Components.classes["@mozilla.org/observer-service;1"].
+        getService(Components.interfaces.nsIObserverService);
+
+    os.notifyObservers(null, "child-memory-reporter-request", null);
+  } else {
+    collectAndReport(null, null, null);
+  }
+}
+
+function collectAndReport(aSubject, aTopic, aData) {
+  dumpLine(collectRSS());
+  gMemCallback();
+}
+
+function collectRSS() {
+  var mgr = Components.classes["@mozilla.org/memory-reporter-manager;1"].
+      getService(Components.interfaces.nsIMemoryReporterManager);
+  var e = mgr.enumerateReporters();
+  text = "";
+  while (e.hasMoreElements()) {
+    var reporter = e.getNext().QueryInterface(Components.interfaces.nsIMemoryReporter);
+    if (reporter.path == 'resident') {
+      procName = reporter.process;
+      if (procName == '')
+        procName = "Main";
+        
+      //For content process it is in the format "Content (<PID>)", we just want Content
+      procName = procName.split(' ')[0];
+      text += "RSS: " + procName + ": " + reporter.amount + "\n";
+    }
+  }
+  return text;
+}
+
+/*
+ * Cleanup and stop memory collector.
+ */
+function stopMemCollector() {
+  if (gChildProcess) {
+    var os = Cc["@mozilla.org/observer-service;1"].
+        getService(Ci.nsIObserverService);
+    os.removeObserver(collectAndReport, "child-memory-reporter-update");
+  }
+}