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.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@203370 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/LayoutTests/TestExpectations b/LayoutTests/TestExpectations
index 18c1e9f..ef9b3a1 100644
--- a/LayoutTests/TestExpectations
+++ b/LayoutTests/TestExpectations
@@ -1003,6 +1003,11 @@
webkit.org/b/159678 http/tests/preload/single_download_preload_runner.html [ Timeout ]
+# This test is way too slow for debug.
+[ Debug ] workers/bomb.html [ Skip ]
+# This test is just way too slow.
+workers/bomb-with-v8.html [ Skip ]
+
# WebCryptoAPI tests, skip for unimplemented features. webkit.org/b/159638
imported/w3c/WebCryptoAPI/encrypt_decrypt/test_aes_cbc.html [ Skip ]
imported/w3c/WebCryptoAPI/encrypt_decrypt/test_aes_ctr.html [ Skip ]