зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1068144 - Expose allocation time stamps in the memory actor. r=jryans
This commit is contained in:
Родитель
f067fa09ee
Коммит
1f814201af
|
@ -209,7 +209,12 @@ let MemoryActor = protocol.ActorClass({
|
|||
* An object of the form:
|
||||
*
|
||||
* {
|
||||
* allocations: [<index into "frames" below> ...],
|
||||
* allocations: [<index into "frames" below>, ...],
|
||||
* allocationsTimestamps: [
|
||||
* <timestamp for allocations[0]>,
|
||||
* <timestamp for allocations[1]>,
|
||||
* ...
|
||||
* ],
|
||||
* frames: [
|
||||
* {
|
||||
* line: <line number for this frame>,
|
||||
|
@ -217,7 +222,7 @@ let MemoryActor = protocol.ActorClass({
|
|||
* source: <filename string for this frame>,
|
||||
* functionDisplayName: <this frame's inferred function name function or null>,
|
||||
* parent: <index into "frames">
|
||||
* }
|
||||
* },
|
||||
* ...
|
||||
* ],
|
||||
* counts: [
|
||||
|
@ -228,6 +233,8 @@ let MemoryActor = protocol.ActorClass({
|
|||
* ]
|
||||
* }
|
||||
*
|
||||
* The timestamps' unit is microseconds since the epoch.
|
||||
*
|
||||
* Subsequent `getAllocations` request within the same recording and
|
||||
* tab navigation will always place the same stack frames at the same
|
||||
* indices as previous `getAllocations` requests in the same
|
||||
|
@ -255,10 +262,11 @@ let MemoryActor = protocol.ActorClass({
|
|||
getAllocations: method(expectState("attached", function() {
|
||||
const allocations = this.dbg.memory.drainAllocationsLog()
|
||||
const packet = {
|
||||
allocations: []
|
||||
allocations: [],
|
||||
allocationsTimestamps: []
|
||||
};
|
||||
|
||||
for (let { frame: stack } of allocations) {
|
||||
for (let { frame: stack, timestamp } of allocations) {
|
||||
if (stack && Cu.isDeadWrapper(stack)) {
|
||||
continue;
|
||||
}
|
||||
|
@ -275,6 +283,7 @@ let MemoryActor = protocol.ActorClass({
|
|||
this._countFrame(waived);
|
||||
|
||||
packet.allocations.push(this._framesToIndices.get(waived));
|
||||
packet.allocationsTimestamps.push(timestamp);
|
||||
}
|
||||
|
||||
// Now that we are guaranteed to have a form for every frame, we know the
|
||||
|
|
|
@ -79,6 +79,7 @@ skip-if = buildapp == 'mulet'
|
|||
[test_memory_allocations_02.html]
|
||||
[test_memory_allocations_03.html]
|
||||
[test_memory_allocations_04.html]
|
||||
[test_memory_allocations_05.html]
|
||||
[test_memory_attach_01.html]
|
||||
[test_memory_attach_02.html]
|
||||
[test_memory_census.html]
|
||||
|
|
|
@ -0,0 +1,87 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<!--
|
||||
Bug 1068144 - Test getting the timestamps for allocations.
|
||||
-->
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Memory monitoring actor test</title>
|
||||
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css">
|
||||
</head>
|
||||
<body>
|
||||
<pre id="test">
|
||||
<script src="memory-helpers.js" type="application/javascript;version=1.8"></script>
|
||||
<script>
|
||||
window.onload = function() {
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
||||
Task.spawn(function* () {
|
||||
var { memory, client } = yield startServerAndGetSelectedTabMemory();
|
||||
yield memory.attach();
|
||||
|
||||
var allocs = [];
|
||||
function allocator() {
|
||||
allocs.push(new Object);
|
||||
}
|
||||
|
||||
// Using setTimeout results in wildly varying delays that make it hard to
|
||||
// test our timestamps and results in intermittent failures. Instead, we
|
||||
// actually spin an empty loop for a whole millisecond.
|
||||
function actuallyWaitOneWholeMillisecond() {
|
||||
var start = window.performance.now();
|
||||
while (window.performance.now() - start < 1.000) ;
|
||||
}
|
||||
|
||||
yield memory.startRecordingAllocations();
|
||||
|
||||
allocator();
|
||||
actuallyWaitOneWholeMillisecond();
|
||||
allocator();
|
||||
actuallyWaitOneWholeMillisecond();
|
||||
allocator();
|
||||
|
||||
var response = yield memory.getAllocations();
|
||||
yield memory.stopRecordingAllocations();
|
||||
|
||||
ok(response.allocationsTimestamps, "The response should have timestamps.");
|
||||
is(response.allocationsTimestamps.length, response.allocations.length,
|
||||
"There should be a timestamp for every allocation.");
|
||||
|
||||
var allocatorIndices = response.allocations
|
||||
.map(function (a, idx) {
|
||||
var frame = response.frames[a];
|
||||
if (frame && frame.functionDisplayName === "allocator") {
|
||||
return idx;
|
||||
}
|
||||
})
|
||||
.filter(function (idx) {
|
||||
return idx !== undefined;
|
||||
});
|
||||
|
||||
is(allocatorIndices.length, 3, "Should have our 3 allocations from the `allocator` timeouts.");
|
||||
|
||||
var lastTimestamp;
|
||||
for (var i = 0; i < 3; i++) {
|
||||
var timestamp = response.allocationsTimestamps[allocatorIndices[i]];
|
||||
info("timestamp", timestamp);
|
||||
ok(timestamp, "We should have a timestamp for the `allocator` allocation.");
|
||||
|
||||
if (lastTimestamp) {
|
||||
var delta = timestamp - lastTimestamp;
|
||||
info("delta since last timestamp", delta);
|
||||
ok(delta >= 1000 /* 1 ms */,
|
||||
"The timestamp should be about 1 ms after the last timestamp.");
|
||||
}
|
||||
|
||||
lastTimestamp = timestamp;
|
||||
}
|
||||
|
||||
yield memory.detach();
|
||||
destroyServerAndFinish(client);
|
||||
});
|
||||
};
|
||||
</script>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
Загрузка…
Ссылка в новой задаче