<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
</head>
<body>
<script>
function getOrCreate(id, tagName)
{
    var element = document.getElementById(id);
    if (element)
        return element;
    
    element = document.createElement(tagName);
    element.id = id;
    var parent = document.body || document.documentElement;
    var refNode = parent.firstChild;
    
    parent.insertBefore(element, refNode);
    return element;
}

function debug(msg)
{
    var span = document.createElement("span");
    getOrCreate("console", "div").appendChild(span); // insert it first so XHTML knows the namespace
    span.innerHTML = msg + '<br />';
}

if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

var verbose = false;

var sab = new SharedArrayBuffer(3 * 4);

var didStart = new Int32Array(sab, 0, 1);
var shouldGo = new Int32Array(sab, 4, 1);
var didEnd = new Int32Array(sab, 8, 1);

var numWorkers = 0;
function startWorker(file)
{
    if (verbose)
        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;
        }
        if (event.data.indexOf("Error") == 0) {
            debug("Test failed: "+ event.data);
            if (window.testRunner)
                testRunner.notifyDone();
        }
        
        if (verbose)
            debug("Event from " + file + ": " + event.data);
    };
    worker.postMessage({didStart: didStart, shouldGo: shouldGo, didEnd: didEnd, shouldShareBuffer: true});
}

function done()
{
    if (didStart[0] != 1)
        throw "Error: Bad value at didStart[0]: " + didStart[0];
    if (shouldGo[0] != 1)
        throw "Error: Bad value at shouldGo[0]: " + shouldGo[0];
    if (didEnd[0] != 1)
        throw "Error: Bad value at didEnd[0]: " + didEnd[0];
    debug("Test passed!");

    if (window.testRunner)
        testRunner.notifyDone();
}

startWorker("multi-memory-worker-1.js");
startWorker("multi-memory-worker-2.js");

</script>
</body>
</html>
