mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-02 15:15:23 +00:00
e4ced412bb
This has a few semi-interdependent pieces: * Factoring out the file opening/closing/renaming from the GC/CC logging. * Using IPC to have the child log to files that the parent opened. * Changing nsIMemoryInfoDumper.dumpGCAndCCLogsToFile to report completion of child process logging (which was impossible before this, and which is needed to have a meaningful test case). * Changing about:memory to dump logs for child processes, matching the behavior of the "Measure" button, because it can tell the user where they are now. * Add a test for multiprocess GC/CC log dumping (only of the XPCOM interface, not by clicking buttons and scraping the about:memory page, but done as a chrome mochitest to start remote browsers); based on test_memoryReporters2.xul in the same directory.
99 lines
3.0 KiB
XML
99 lines
3.0 KiB
XML
<?xml version="1.0"?>
|
|
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
|
|
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
|
|
type="text/css"?>
|
|
<window title="GC/CC logging with child processes"
|
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
|
<script type="application/javascript"
|
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
|
|
|
|
<!-- test results are displayed in the html:body -->
|
|
<body xmlns="http://www.w3.org/1999/xhtml">
|
|
</body>
|
|
|
|
<!-- test code goes here -->
|
|
<script type="application/javascript"><![CDATA[
|
|
|
|
const Cc = Components.classes;
|
|
const Ci = Components.interfaces;
|
|
|
|
SimpleTest.waitForExplicitFinish();
|
|
|
|
let numRemotes = 3;
|
|
let numReady = 0;
|
|
|
|
// Create some remote processes, and set up message-passing so that
|
|
// we know when each child is fully initialized.
|
|
let remotes = [];
|
|
SpecialPowers.pushPrefEnv({"set": [["dom.ipc.processCount", numRemotes]]},
|
|
function() {
|
|
for (let i = 0; i < numRemotes; i++) {
|
|
let w = remotes[i] = window.open("remote.xul", "", "chrome");
|
|
|
|
w.addEventListener("load", function loadHandler() {
|
|
w.removeEventListener("load", loadHandler);
|
|
let remoteBrowser = w.document.getElementById("remote");
|
|
let mm = remoteBrowser.messageManager;
|
|
mm.addMessageListener("test:ready", function readyHandler() {
|
|
mm.removeMessageListener("test:ready", readyHandler);
|
|
numReady++;
|
|
if (numReady == numRemotes) {
|
|
// All the remote processes are ready. Run test.
|
|
runTest();
|
|
}
|
|
});
|
|
mm.loadFrameScript("data:," + encodeURI("sendAsyncMessage('test:ready');"), true);
|
|
});
|
|
}
|
|
});
|
|
|
|
let dumper = Cc["@mozilla.org/memory-info-dumper;1"].
|
|
getService(Ci.nsIMemoryInfoDumper);
|
|
|
|
function runTest()
|
|
{
|
|
let numParents = 0;
|
|
let numChildren = 0;
|
|
dumper.dumpGCAndCCLogsToFile(
|
|
/* identifier: */ "test." + Date.now(),
|
|
/* allTraces: */ false,
|
|
/* childProcesses: */ true,
|
|
{
|
|
onDump: function(gcLog, ccLog, isParent) {
|
|
if (isParent) {
|
|
numParents++;
|
|
} else {
|
|
numChildren++;
|
|
}
|
|
checkAndRemoveLog(gcLog);
|
|
checkAndRemoveLog(ccLog);
|
|
},
|
|
onFinish: function() {
|
|
is(numParents, 1,
|
|
"GC/CC logs for the parent process");
|
|
is(numChildren, numRemotes,
|
|
"GC/CC logs for each child process");
|
|
cleanUpAndFinish();
|
|
}
|
|
});
|
|
}
|
|
|
|
function cleanUpAndFinish() {
|
|
// Close the remote processes.
|
|
for (let i = 0; i < numRemotes; i++) {
|
|
remotes[i].close();
|
|
}
|
|
SimpleTest.finish();
|
|
}
|
|
|
|
function checkAndRemoveLog(logFile) {
|
|
let name = logFile.path;
|
|
ok(logFile.exists(), "log file "+name+" exists");
|
|
ok(logFile.isFile(), "log file "+name+" is a regular file");
|
|
ok(logFile.fileSize > 0, "log file "+name+" is not empty");
|
|
logFile.remove(/* recursive: */ false);
|
|
}
|
|
|
|
]]></script>
|
|
</window>
|