summaryrefslogtreecommitdiffstats
path: root/devtools/server/actors/monitor.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/server/actors/monitor.js')
-rw-r--r--devtools/server/actors/monitor.js145
1 files changed, 145 insertions, 0 deletions
diff --git a/devtools/server/actors/monitor.js b/devtools/server/actors/monitor.js
new file mode 100644
index 000000000..17b076a9e
--- /dev/null
+++ b/devtools/server/actors/monitor.js
@@ -0,0 +1,145 @@
+/* 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 {Ci, Cc} = require("chrome");
+const {XPCOMUtils} = require("resource://gre/modules/XPCOMUtils.jsm");
+const Services = require("Services");
+
+function MonitorActor(aConnection) {
+ this.conn = aConnection;
+ this._updates = [];
+ this._started = false;
+}
+
+MonitorActor.prototype = {
+ actorPrefix: "monitor",
+
+ // Updates.
+
+ _sendUpdate: function () {
+ if (this._started) {
+ this.conn.sendActorEvent(this.actorID, "update", { data: this._updates });
+ this._updates = [];
+ }
+ },
+
+ // Methods available from the front.
+
+ start: function () {
+ if (!this._started) {
+ this._started = true;
+ Services.obs.addObserver(this, "devtools-monitor-update", false);
+ Services.obs.notifyObservers(null, "devtools-monitor-start", "");
+ this._agents.forEach(agent => this._startAgent(agent));
+ }
+ return {};
+ },
+
+ stop: function () {
+ if (this._started) {
+ this._agents.forEach(agent => agent.stop());
+ Services.obs.notifyObservers(null, "devtools-monitor-stop", "");
+ Services.obs.removeObserver(this, "devtools-monitor-update");
+ this._started = false;
+ }
+ return {};
+ },
+
+ disconnect: function () {
+ this.stop();
+ },
+
+ // nsIObserver.
+
+ observe: function (subject, topic, data) {
+ if (topic == "devtools-monitor-update") {
+ try {
+ data = JSON.parse(data);
+ } catch (e) {
+ console.error("Observer notification data is not a valid JSON-string:",
+ data, e.message);
+ return;
+ }
+ if (!Array.isArray(data)) {
+ this._updates.push(data);
+ } else {
+ this._updates = this._updates.concat(data);
+ }
+ this._sendUpdate();
+ }
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver]),
+
+ // Update agents (see USSAgent for an example).
+
+ _agents: [],
+
+ _startAgent: function (agent) {
+ try {
+ agent.start();
+ } catch (e) {
+ this._removeAgent(agent);
+ }
+ },
+
+ _addAgent: function (agent) {
+ this._agents.push(agent);
+ if (this._started) {
+ this._startAgent(agent);
+ }
+ },
+
+ _removeAgent: function (agent) {
+ let index = this._agents.indexOf(agent);
+ if (index > -1) {
+ this._agents.splice(index, 1);
+ }
+ },
+};
+
+MonitorActor.prototype.requestTypes = {
+ "start": MonitorActor.prototype.start,
+ "stop": MonitorActor.prototype.stop,
+};
+
+exports.MonitorActor = MonitorActor;
+
+var USSAgent = {
+ _mgr: null,
+ _timeout: null,
+ _packet: {
+ graph: "USS",
+ time: null,
+ value: null
+ },
+
+ start: function () {
+ USSAgent._mgr = Cc["@mozilla.org/memory-reporter-manager;1"].getService(Ci.nsIMemoryReporterManager);
+ if (!USSAgent._mgr.residentUnique) {
+ throw "Couldn't get USS.";
+ }
+ USSAgent.update();
+ },
+
+ update: function () {
+ if (!USSAgent._mgr) {
+ USSAgent.stop();
+ return;
+ }
+ USSAgent._packet.time = Date.now();
+ USSAgent._packet.value = USSAgent._mgr.residentUnique;
+ Services.obs.notifyObservers(null, "devtools-monitor-update", JSON.stringify(USSAgent._packet));
+ USSAgent._timeout = setTimeout(USSAgent.update, 300);
+ },
+
+ stop: function () {
+ clearTimeout(USSAgent._timeout);
+ USSAgent._mgr = null;
+ }
+};
+
+MonitorActor.prototype._addAgent(USSAgent);