blob: 5873bbfe0a6c0bddb23a6ef4aa32db06d5142f6b [file] [log] [blame]
// Useful utilities for worker tests
function log(message)
{
document.getElementById("result").innerHTML += message + "<br>";
}
function gc(forceAlloc)
{
if (typeof GCController !== "undefined")
GCController.collect();
if (typeof GCController == "undefined" || forceAlloc) {
function gcRec(n) {
if (n < 1)
return {};
var temp = {i: "ab" + i + (i / 100000)};
temp += "foo";
gcRec(n-1);
}
for (var i = 0; i < 1000; i++)
gcRec(10)
}
}
function waitUntilWorkerThreadsExit(callback)
{
waitUntilThreadCountMatches(callback, 0);
}
function waitUntilThreadCountMatchesCondition(callback, condition)
{
// When running in a browser, just wait for one second then call the callback.
if (!window.testRunner) {
setTimeout(function() { gc(true); callback(); }, 1000);
return;
}
if (condition()) {
// Worker threads have exited.
callback();
} else {
// Poll until worker threads have been GC'd/exited.
// Force a GC with a bunch of allocations to try to scramble the stack and force worker objects to be collected.
gc(true);
setTimeout(function() { waitUntilThreadCountMatchesCondition(callback, condition); }, 10);
}
}
function waitUntilThreadCountMatches(callback, count)
{
waitUntilThreadCountMatchesCondition(callback, function() { return internals.workerThreadCount == count; });
}
function waitUntilThreadCountDoesNotExceed(callback, count)
{
waitUntilThreadCountMatchesCondition(callback, function() { return internals.workerThreadCount <= count; });
}
function ensureThreadCountMatches(callback, count)
{
// Just wait until the thread count matches, then wait another 100ms to see if it changes, then fire the callback.
waitUntilThreadCountMatches(function() {
setTimeout(function() { waitUntilThreadCountMatches(callback, count); }, 100);
}, count);
}
function done()
{
if (window.debug)
debug('<br><span class="pass">TEST COMPLETE</span>');
else
log("DONE");
// Call notifyDone via the queue so any pending console messages/exceptions are written out first.
setTimeout(function() {
if (window.testRunner)
testRunner.notifyDone();
}, 0);
}