Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(103)

Unified Diff: tools/profviz/profviz.js

Issue 17592002: Add v8.log visualizer page. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: small changes Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/profviz/profviz.html ('k') | tools/profviz/stdio.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/profviz/profviz.js
diff --git a/tools/profviz/profviz.js b/tools/profviz/profviz.js
new file mode 100644
index 0000000000000000000000000000000000000000..cbfee7a0d19dae921b42eff2070e75309ea1ba2e
--- /dev/null
+++ b/tools/profviz/profviz.js
@@ -0,0 +1,235 @@
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+var worker_scripts = [
+ "../csvparser.js",
+ "../splaytree.js",
+ "../codemap.js",
+ "../profile.js",
+ "../profile_view.js",
+ "../logreader.js",
+ "../tickprocessor.js",
+ "composer.js",
+ "gnuplot-4.6.3-emscripten.js"
+];
+
+
+function plotWorker() {
+ var worker = null;
+
+ var delegateList = {
+ "log" : log,
+ "error" : logError,
+ "display" : display,
+ "range" : setRange,
+ "script" : scriptLoaded
+ }
+
+ function initialize() {
+ ui.freeze();
+ worker = new Worker("worker.js");
+ running = false;
+
+ worker.postMessage({ "call" : "load scripts",
+ "args" : worker_scripts });
+
+ worker.addEventListener("message", function(event) {
+ var call = delegateList[event.data["call"]];
+ call(event.data["args"]);
+ });
+ }
+
+ function scriptLoaded() {
+ ui.thaw();
+ }
+
+ // Public methods.
+ this.run = function(filename,
+ resx, resy,
+ distortion,
+ range_start, range_end) {
+ var args = {
+ 'file' : filename,
+ 'resx' : resx,
+ 'resy' : resy,
+ 'distortion' : distortion,
+ 'range_start' : range_start,
+ 'range_end' : range_end
+ }
+ worker.postMessage({ 'call' : 'run', 'args' : args });
+ }
+
+ this.reset = function() {
+ if (worker) worker.terminate();
+ initialize();
+ }
+}
+
+
+function UIWrapper() {
+ var input_elements = ["range_start",
+ "range_end",
+ "distortion",
+ "start",
+ "file"];
+
+ this.log = document.getElementById("log");
+ this.plot = document.getElementById('plot');
+ for (var i in input_elements) {
+ var id = input_elements[i];
+ this[id] = document.getElementById(id);
+ }
+
+ this.freeze = function() {
+ this.plot.style.webkitFilter = "grayscale(1)";
+ for (var i in input_elements) {
+ this[input_elements[i]].disabled = true;
+ }
+ }
+
+ this.thaw = function() {
+ this.plot.style.webkitFilter = "";
+ for (var i in input_elements) {
+ this[input_elements[i]].disabled = false;
+ }
+ }
+
+ this.reset = function() {
+ this.thaw();
+ this.log.value = "";
+ this.range_start.value = "automatic";
+ this.range_end.value = "automatic";
+ }
+}
+
+
+function log(text) {
+ ui.log.value += text;
+ ui.log.scrollTop = ui.log.scrollHeight;
+}
+
+
+function logError(text) {
+ if (ui.log.value.length > 0 &&
+ ui.log.value[ui.log.value.length-1] != "\n") {
+ ui.log.value += "\n";
+ }
+ ui.log.value += "ERROR: " + text + "\n";
+ ui.log.scrollTop = ui.log.scrollHeight;
+ error_logged = true;
+}
+
+
+function display(args) {
+ if (error_logged) {
+ log("Plot failed.\n\n");
+ } else {
+ log("Displaying plot. Total time: " +
+ (Date.now() - timer) / 1000 + "ms.\n\n");
+ var blob = new Blob([new Uint8Array(args.contents).buffer],
+ { "type" : "image\/svg+xml" });
+ window.URL = window.URL || window.webkitURL;
+ ui.plot.src = window.URL.createObjectURL(blob);
+ }
+
+ ui.thaw();
+}
+
+
+function start(event) {
+ error_logged = false;
+ ui.freeze();
+
+ try {
+ var file = getSelectedFile();
+ var distortion = getDistortion();
+ var range = getRange();
+ } catch (e) {
+ logError(e.message);
+ display();
+ return;
+ }
+
+ timer = Date.now();
+ worker.run(file, kResX, kResY, distortion, range[0], range[1]);
+}
+
+
+function getSelectedFile() {
+ var file = ui.file.files[0];
+ if (!file) throw Error("No valid file selected.");
+ if (!file.type.toString().match(/text/)) {
+ throw Error("'" + escape(file.name) + "' is not a text file.");
+ }
+ return file;
+}
+
+
+function getDistortion() {
+ var input_distortion =
+ parseInt(ui.distortion.value, 10);
+ if (isNaN(input_distortion)) {
+ input_distortion = ui.distortion.value = 4500;
+ }
+ return input_distortion / 1000000;
+}
+
+
+function getRange() {
+ var input_start =
+ parseInt(ui.range_start.value, 10);
+ if (isNaN(input_start)) input_start = undefined;
+ var input_end =
+ parseInt(ui.range_end.value, 10);
+ if (isNaN(input_end)) input_end = undefined;
+ return [input_start, input_end];
+}
+
+
+function setRange(args) {
+ ui.range_start.value = args.start.toFixed(1);
+ ui.range_end.value = args.end.toFixed(1);
+}
+
+
+function onload() {
+ kResX = 1600;
+ kResY = 900;
+ error_logged = false;
+ ui = new UIWrapper();
+ ui.reset();
+ worker = new plotWorker();
+ worker.reset();
+}
+
+
+var kResX;
+var kResY;
+var error_logged;
+var ui;
+var worker;
+var timer;
« no previous file with comments | « tools/profviz/profviz.html ('k') | tools/profviz/stdio.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698