Browse Source

tools: single, cross-platform tick processor

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>
v5.x
Matt Loring 9 years ago
committed by Ben Noordhuis
parent
commit
e0c3d2ad57
  1. 16
      test/parallel/test-tick-processor.js
  2. 23
      tools/v8-prof/linux-tick-processor
  3. 7
      tools/v8-prof/mac-tick-processor
  4. 51
      tools/v8-prof/tick-processor.js
  5. 19
      tools/v8-prof/windows-tick-processor.bat

16
test/parallel/test-tick-processor.js

@ -8,7 +8,7 @@ var common = require('../common');
common.refreshTmpDir(); common.refreshTmpDir();
process.chdir(common.tmpDir); process.chdir(common.tmpDir);
var processor = 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, // Unknown checked for to prevent flakiness, if pattern is not found,
// then a large number of unknown ticks should be present // then a large number of unknown ticks should be present
runTest(/LazyCompile.*\[eval\]:1|.*% UNKNOWN/, runTest(/LazyCompile.*\[eval\]:1|.*% UNKNOWN/,
@ -43,19 +43,9 @@ function runTest(pattern, code) {
assert.fail('There should be a single log file.'); assert.fail('There should be a single log file.');
} }
var log = matches[0]; 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'}); {encoding: 'utf8'});
assert(out.match(pattern)); assert(out.match(pattern));
fs.unlinkSync(log); 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';
}
}

23
tools/v8-prof/linux-tick-processor

@ -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"

7
tools/v8-prof/mac-tick-processor

@ -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" $@

51
tools/v8-prof/tick-processor.js

@ -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' });
});

19
tools/v8-prof/windows-tick-processor.bat

@ -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%
Loading…
Cancel
Save