1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
/* This Source Code Form is subject to the terms of the Mozilla Public
* 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/. */
"use strict";
const { Actor } = require("resource://devtools/shared/protocol.js");
const { memorySpec } = require("resource://devtools/shared/specs/memory.js");
const { Memory } = require("resource://devtools/server/performance/memory.js");
const {
actorBridgeWithSpec,
} = require("resource://devtools/server/actors/common.js");
loader.lazyRequireGetter(
this,
"StackFrameCache",
"resource://devtools/server/actors/utils/stack.js",
true
);
/**
* An actor that returns memory usage data for its parent actor's window.
* A target-scoped instance of this actor will measure the memory footprint of
* the target, such as a tab. A global-scoped instance however, will measure the memory
* footprint of the chrome window referenced by the root actor.
*
* This actor wraps the Memory module at devtools/server/performance/memory.js
* and provides RDP definitions.
*
* @see devtools/server/performance/memory.js for documentation.
*/
exports.MemoryActor = class MemoryActor extends Actor {
constructor(conn, parent, frameCache = new StackFrameCache()) {
super(conn, memorySpec);
this._onGarbageCollection = this._onGarbageCollection.bind(this);
this._onAllocations = this._onAllocations.bind(this);
this.bridge = new Memory(parent, frameCache);
this.bridge.on("garbage-collection", this._onGarbageCollection);
this.bridge.on("allocations", this._onAllocations);
}
destroy() {
this.bridge.off("garbage-collection", this._onGarbageCollection);
this.bridge.off("allocations", this._onAllocations);
this.bridge.destroy();
super.destroy();
}
attach = actorBridgeWithSpec("attach");
detach = actorBridgeWithSpec("detach");
getState = actorBridgeWithSpec("getState");
saveHeapSnapshot(boundaries) {
return this.bridge.saveHeapSnapshot(boundaries);
}
takeCensus = actorBridgeWithSpec("takeCensus");
startRecordingAllocations = actorBridgeWithSpec("startRecordingAllocations");
stopRecordingAllocations = actorBridgeWithSpec("stopRecordingAllocations");
getAllocationsSettings = actorBridgeWithSpec("getAllocationsSettings");
getAllocations = actorBridgeWithSpec("getAllocations");
forceGarbageCollection = actorBridgeWithSpec("forceGarbageCollection");
forceCycleCollection = actorBridgeWithSpec("forceCycleCollection");
measure = actorBridgeWithSpec("measure");
residentUnique = actorBridgeWithSpec("residentUnique");
_onGarbageCollection(data) {
if (this.conn.transport) {
this.emit("garbage-collection", data);
}
}
_onAllocations(data) {
if (this.conn.transport) {
this.emit("allocations", data);
}
}
};
|