haikuwebkit/LayoutTests/workers/bomb.html

83 lines
2.2 KiB
HTML
Raw Permalink Normal View History

Source/JavaScriptCore: Repeatedly creating and destroying workers that enqueue DFG plans can outpace the DFG worklist, which then causes VM shutdown to stall, which then causes memory growth https://bugs.webkit.org/show_bug.cgi?id=159754 Reviewed by Geoffrey Garen. If you create and destroy workers at a high rate and those workers enqueue some DFG plans that are still not compiled at the time that the worker is closed, then the closed workers end up stalling in VM::~VM waiting for the DFG worklist thread to finish those plans. Since we don't actually cancel the plans, it's easy to create a situation where the workers outpace the DFG worklist, especially if you create many workers at a time and each one finishes just after enqueueing those plans. The solution is to allow VM::~VM to remove plans from the DFG worklist that are related to that VM but aren't currently being worked on. That turns out to be an easy change. I have a test that repros this, but it's quite long-running. I call it workers/bomb.html. We may want to exclude it from test runs because of how long it takes. * dfg/DFGWorklist.cpp: (JSC::DFG::Worklist::removeDeadPlans): (JSC::DFG::Worklist::removeNonCompilingPlansForVM): (JSC::DFG::Worklist::queueLength): (JSC::DFG::Worklist::runThread): * dfg/DFGWorklist.h: * runtime/VM.cpp: (JSC::VM::~VM): LayoutTests: Repeatedly creating and destroying workers that enqueue DFG plans can outpace the DFG worklist, which then causes VM shutdown to stall, which then causes a memory growth https://bugs.webkit.org/show_bug.cgi?id=159754 Reviewed by Geoffrey Garen. Adds two tests that create a lot of workers that do sophisticated things. These are long-running tests so we may want to skip them. It's OK if we end up only running them manually occasionally. * workers: Added. * workers/bomb.html: Added. * workers/bomb-expected.txt: Added. * workers/bomb-with-v8.html: Added. * workers/tests: Added. * workers/tests/3d-cube.js: Added. * workers/tests/3d-morph.js: Added. * workers/tests/3d-raytrace.js: Added. * workers/tests/access-binary-trees.js: Added. * workers/tests/access-fannkuch.js: Added. * workers/tests/access-nbody.js: Added. * workers/tests/access-nsieve.js: Added. * workers/tests/bitops-3bit-bits-in-byte.js: Added. * workers/tests/bitops-bits-in-byte.js: Added. * workers/tests/bitops-bitwise-and.js: Added. * workers/tests/bitops-nsieve-bits.js: Added. * workers/tests/controlflow-recursive.js: Added. * workers/tests/crypto-aes.js: Added. * workers/tests/crypto-md5.js: Added. * workers/tests/crypto-sha1.js: Added. * workers/tests/date-format-tofte.js: Added. * workers/tests/date-format-xparb.js: Added. * workers/tests/math-cordic.js: Added. * workers/tests/math-partial-sums.js: Added. * workers/tests/math-spectral-norm.js: Added. * workers/tests/regexp-dna.js: Added. * workers/tests/string-base64.js: Added. * workers/tests/string-fasta.js: Added. * workers/tests/string-tagcloud.js: Added. * workers/tests/string-unpack-code.js: Added. * workers/tests/string-validate-input.js: Added. * workers/tests/v8-crypto.js: Added. * workers/tests/v8-deltablue.js: Added. * workers/tests/v8-earley-boyer.js: Added. * workers/tests/v8-raytrace.js: Added. * workers/tests/v8-regexp.js: Added. * workers/tests/v8-richards.js: Added. * workers/tests/v8-splay.js: Added. Canonical link: https://commits.webkit.org/178055@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@203370 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2016-07-18 20:31:20 +00:00
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../resources/js-test-pre.js"></script>
</head>
<body>
<script>
description("Starts a lot of workers that do crazy things.");
if (window.testRunner)
testRunner.waitUntilDone();
var count = 100;
var verbose = false;
var numWorkers = 0;
function startWorker(file)
{
debug("Starting worker: " + file);
numWorkers++;
var worker = new Worker(file);
worker.onmessage = function(event) {
if (event.data == "done") {
if (verbose)
debug("Finished worker: " + file);
if (--numWorkers)
return;
debug("All workers done!");
done();
return;
}
debug("Event from " + file + ": " + event.data);
};
}
function start()
{
startWorker("tests/3d-cube.js");
startWorker("tests/3d-morph.js");
startWorker("tests/3d-raytrace.js");
startWorker("tests/access-binary-trees.js");
startWorker("tests/access-fannkuch.js");
startWorker("tests/access-nbody.js");
startWorker("tests/access-nsieve.js");
startWorker("tests/bitops-3bit-bits-in-byte.js");
startWorker("tests/bitops-bits-in-byte.js");
startWorker("tests/bitops-bitwise-and.js");
startWorker("tests/bitops-nsieve-bits.js");
startWorker("tests/controlflow-recursive.js");
startWorker("tests/crypto-aes.js");
startWorker("tests/crypto-md5.js");
startWorker("tests/crypto-sha1.js");
startWorker("tests/date-format-tofte.js");
startWorker("tests/date-format-xparb.js");
startWorker("tests/math-cordic.js");
startWorker("tests/math-partial-sums.js");
startWorker("tests/math-spectral-norm.js");
startWorker("tests/regexp-dna.js");
startWorker("tests/string-base64.js");
startWorker("tests/string-fasta.js");
startWorker("tests/string-tagcloud.js");
startWorker("tests/string-unpack-code.js");
startWorker("tests/string-validate-input.js");
}
function done()
{
if (!--count) {
debug("Done with test!");
if (window.testRunner)
testRunner.notifyDone();
return;
}
start();
}
start();
</script>
<script src="../resources/js-test-post.js"></script>
</body>
</html>