Mercurial > hg > config
diff chrome/memory.js @ 208:3f290bcae11a
wtf
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Mon, 13 Feb 2012 16:24:06 -0800 |
parents | beca399c3a16 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/chrome/memory.js Mon Feb 13 16:24:06 2012 -0800 @@ -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"); + } +}