fune/browser/components/extensions/ParseCppFiltSymbols-worker.js
Doug Thayer 7469d83745 Bug 1362786 - (3) Run CppFiltParser in worker r=kmag
Pulls out the CppFiltParser work into a worker to run in the
background and avoid the jank induced by the final
convertSymsMapToExpectedSymFormat call.

Profiling shows that after this change there is virtually no
jank when asking the geckoProfiler API for symbols.

MozReview-Commit-ID: CAKMvjLa4dl

--HG--
extra : rebase_source : de9202687ca8ffbfa5216f73fe57e97ffdbea8ef
2017-07-21 14:13:37 -07:00

64 lines
1.6 KiB
JavaScript

/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
/* eslint-env worker */
"use strict";
importScripts("resource:///modules/ParseSymbols.jsm");
class WorkerCppFiltParser {
constructor(length) {
this._decoder = new TextDecoder();
this._index = 0;
this._approximateLength = 0;
this._results = new Array(length);
}
consume(arrayBuffer) {
const data = this._decoder.decode(arrayBuffer, {stream: true});
const lineRegex = /.*\n?/g;
const buffer = this._currentLine + data;
let match;
while ((match = lineRegex.exec(buffer))) {
let [line] = match;
if (line[line.length - 1] === "\n") {
this._processLine(line);
} else {
this._currentLine = line;
break;
}
}
}
finish() {
this._processLine(this._currentLine);
return {symsArray: this._results, approximateLength: this._approximateLength};
}
_processLine(line) {
const trimmed = line.trimRight();
this._approximateLength += trimmed.length;
this._results[this._index++] = trimmed;
}
}
let cppFiltParser;
onmessage = async e => {
try {
if (!cppFiltParser) {
cppFiltParser = new WorkerCppFiltParser();
}
if (e.data.finish) {
const {symsArray, approximateLength} = cppFiltParser.finish();
const result = ParseSymbols.convertSymsArrayToExpectedSymFormat(symsArray, approximateLength);
postMessage({result}, result.map(r => r.buffer));
close();
} else {
cppFiltParser.consume(e.data.buffer);
}
} catch (error) {
postMessage({error: error.toString()});
}
};