tools: single, cross-platform tick processor
authorMatt Loring <mattloring@google.com>
Mon, 14 Sep 2015 22:28:27 +0000 (15:28 -0700)
committerRod Vagg <rod@vagg.org>
Tue, 22 Sep 2015 06:31:38 +0000 (16:31 +1000)
Currently there are three separate tick processor scripts for
mac, windows, and linux. These have been replaced with a single
node.js script to improve maintainability and remove the need
to preserve parallel logic in these separate places.

PR-URL: https://github.com/nodejs/node/pull/2868
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Sakthipriyan Vairamani <thechargingvolcano@gmail.com>
test/parallel/test-tick-processor.js
tools/v8-prof/linux-tick-processor [deleted file]
tools/v8-prof/mac-tick-processor [deleted file]
tools/v8-prof/tick-processor.js [new file with mode: 0644]
tools/v8-prof/windows-tick-processor.bat [deleted file]

index 5e1cf13..d6bf642 100644 (file)
@@ -8,7 +8,7 @@ var common = require('../common');
 common.refreshTmpDir();
 process.chdir(common.tmpDir);
 var processor =
-    path.join(common.testDir, '..', 'tools', 'v8-prof', getScriptName());
+    path.join(common.testDir, '..', 'tools', 'v8-prof', 'tick-processor.js');
 // Unknown checked for to prevent flakiness, if pattern is not found,
 // then a large number of unknown ticks should be present
 runTest(/LazyCompile.*\[eval\]:1|.*%  UNKNOWN/,
@@ -43,19 +43,9 @@ function runTest(pattern, code) {
     assert.fail('There should be a single log file.');
   }
   var log = matches[0];
-  var out = cp.execSync(processor + ' --call-graph-size=10 ' + log,
+  var out = cp.execSync(process.execPath + ' ' + processor +
+                        ' --call-graph-size=10 ' + log,
                         {encoding: 'utf8'});
   assert(out.match(pattern));
   fs.unlinkSync(log);
 }
-
-function getScriptName() {
-  switch (process.platform) {
-    case 'darwin':
-      return 'mac-tick-processor';
-    case 'win32':
-      return 'windows-tick-processor.bat';
-    default:
-      return 'linux-tick-processor';
-  }
-}
diff --git a/tools/v8-prof/linux-tick-processor b/tools/v8-prof/linux-tick-processor
deleted file mode 100755 (executable)
index ba72b3a..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/usr/bin/env bash
-
-umask 077
-TEMP_SCRIPT_FILE="/tmp/node-tick-processor-input-script-$$"
-tools_path=`cd $(dirname "$0");pwd`
-v8_tools="$tools_path/../../deps/v8/tools"
-
-cat "$tools_path/polyfill.js" "$v8_tools/splaytree.js" "$v8_tools/codemap.js" \
-  "$v8_tools/csvparser.js" "$v8_tools/consarray.js" \
-  "$v8_tools/profile.js" "$v8_tools/profile_view.js" \
-  "$v8_tools/logreader.js" "$v8_tools/tickprocessor.js" \
-  "$v8_tools/SourceMap.js" \
-  "$v8_tools/tickprocessor-driver.js" >> "$TEMP_SCRIPT_FILE"
-
-NODE=${NODE:-node}
-
-if [ ! -x "$NODE" ] && [ -x "$(dirname "$0")/../../node" ]; then
-  NODE="$(dirname "$0")/../../node"
-fi
-
-"$NODE" "$TEMP_SCRIPT_FILE" $@
-
-rm -f "$TEMP_SCRIPT_FILE"
diff --git a/tools/v8-prof/mac-tick-processor b/tools/v8-prof/mac-tick-processor
deleted file mode 100755 (executable)
index 968df80..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-
-# A wrapper script to call 'linux-tick-processor' with Mac-specific settings.
-
-tools_path=`cd $(dirname "$0");pwd`
-v8_tools="$tools_path/../../deps/v8/tools"
-"$tools_path/linux-tick-processor" --mac --nm="$v8_tools/mac-nm" $@
diff --git a/tools/v8-prof/tick-processor.js b/tools/v8-prof/tick-processor.js
new file mode 100644 (file)
index 0000000..b25bcb7
--- /dev/null
@@ -0,0 +1,51 @@
+'use strict';
+var cp = require('child_process');
+var fs = require('fs');
+var path = require('path');
+
+var toolsPath = path.join(__dirname, '..', '..', 'deps', 'v8', 'tools');
+var scriptFiles = [
+    path.join(__dirname, 'polyfill.js'),
+    path.join(toolsPath, 'splaytree.js'),
+    path.join(toolsPath, 'codemap.js'),
+    path.join(toolsPath, 'csvparser.js'),
+    path.join(toolsPath, 'consarray.js'),
+    path.join(toolsPath, 'csvparser.js'),
+    path.join(toolsPath, 'consarray.js'),
+    path.join(toolsPath, 'profile.js'),
+    path.join(toolsPath, 'profile_view.js'),
+    path.join(toolsPath, 'logreader.js'),
+    path.join(toolsPath, 'tickprocessor.js'),
+    path.join(toolsPath, 'SourceMap.js'),
+    path.join(toolsPath, 'tickprocessor-driver.js')];
+var tempScript = path.join(__dirname, 'tick-processor-tmp-' + process.pid);
+
+process.on('exit', function() {
+  try { fs.unlinkSync(tempScript); } catch (e) {}
+});
+process.on('uncaughtException', function(err) {
+  try { fs.unlinkSync(tempScript); } catch (e) {}
+  throw err;
+});
+
+var inStreams = scriptFiles.map(function(f) {
+  return fs.createReadStream(f);
+});
+var outStream = fs.createWriteStream(tempScript);
+inStreams.reduce(function(prev, curr, i) {
+  prev.on('end', function() {
+    curr.pipe(outStream, { end: i === inStreams.length - 1});
+  });
+  return curr;
+});
+inStreams[0].pipe(outStream, { end: false });
+outStream.on('close', function() {
+  var tickArguments = [tempScript];
+  if (process.platform === 'darwin') {
+    tickArguments.push('--mac', '--nm=' + path.join(toolsPath, 'mac-nm'));
+  } else if (process.platform === 'win32') {
+    tickArguments.push('--windows');
+  }
+  tickArguments.push.apply(tickArguments, process.argv.slice(2));
+  var processTicks = cp.spawn(process.execPath, tickArguments, { stdio: 'inherit' });
+});
diff --git a/tools/v8-prof/windows-tick-processor.bat b/tools/v8-prof/windows-tick-processor.bat
deleted file mode 100755 (executable)
index 8b5d791..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-@echo off
-setlocal
-
-SET tools_dir=%~dp0
-SET v8_tools=%tools_dir%..\..\deps\v8\tools\
-
-SET temp_script=%TEMP%\node-tick-processor-input-script
-
-IF NOT DEFINED NODE (SET NODE=node.exe)
-%NODE% --version 2> NUL
-if %ERRORLEVEL%==9009 (SET NODE=%~dp0\..\..\Release\node.exe)
-
-
-type %tools_dir%polyfill.js %v8_tools%splaytree.js %v8_tools%codemap.js^
- %v8_tools%csvparser.js %v8_tools%consarray.js %v8_tools%profile.js^
- %v8_tools%profile_view.js %v8_tools%logreader.js %v8_tools%SourceMap.js^
- %v8_tools%tickprocessor.js %v8_tools%tickprocessor-driver.js >> %temp_script%
-%NODE% %temp_script% --windows %*
-del %temp_script%