haikuwebkit/LayoutTests/workers/tests/3d-morph.js

67 lines
2.4 KiB
JavaScript
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
/*
* Copyright (C) 2007 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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 loops = 15
var nx = 120
var nz = 120
function morph(a, f) {
var PI2nx = Math.PI * 8/nx
var sin = Math.sin
var f30 = -(50 * sin(f*Math.PI*2))
for (var i = 0; i < nz; ++i) {
for (var j = 0; j < nx; ++j) {
a[3*(i*nx+j)+1] = sin((j-1) * PI2nx ) * -f30
}
}
}
var a = Array()
for (var i=0; i < nx*nz*3; ++i)
a[i] = 0
for (var i = 0; i < loops; ++i) {
morph(a, i/loops)
}
testOutput = 0;
for (var i = 0; i < nx; i++)
testOutput += a[3*(i*nx+i)+1];
a = null;
// This has to be an approximate test since ECMAscript doesn't formally specify
// what sin() returns. Even if it did specify something like for example what Java 7
// says - that sin() has to return a value within 1 ulp of exact - then we still
// would not be able to do an exact test here since that would allow for just enough
// low-bit slop to create possibly big errors due to testOutput being a sum.
var epsilon = 1e-13;
if (Math.abs(testOutput) >= epsilon)
throw "Error: bad test output: expected magnitude below " + epsilon + " but got " + testOutput;
postMessage("done");
close();