diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-10-22 15:30:03 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-10-22 15:30:03 -0700 |
commit | e48db465e2a2f13b2e9c4797d3334fc6d2b29b6d (patch) | |
tree | 79937100322df639de1bc78b3f1d3dd25871650c /src/library_browser.js | |
parent | 11a4926fc6c2bfe43fef3c66ad30e4b2df612616 (diff) |
initial work on worker api
Diffstat (limited to 'src/library_browser.js')
-rw-r--r-- | src/library_browser.js | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/library_browser.js b/src/library_browser.js index 99106fc3..7e2866b8 100644 --- a/src/library_browser.js +++ b/src/library_browser.js @@ -42,6 +42,7 @@ mergeInto(LibraryManager.library, { }, pointerLock: false, moduleContextCreatedCallbacks: [], + workers: [], ensureObjects: function() { if (Browser.ensured) return; @@ -565,6 +566,71 @@ mergeInto(LibraryManager.library, { } else { return Date.now(); } + }, + + emscripten_create_worker: function(url) { + url = Pointer_stringify(url); + var id = Browser.workers.length; + var info = { + worker: new Worker(url), + callbacks: [], + buffer: 0, + bufferSize: 0 + }; + info.worker.onmessage = function(msg) { + var info = Browser.workers[id]; + if (!info) return; // worker was destroyed meanwhile + var callbackId = msg.data.callbackId; + var callbackInfo = info.callbacks[callbackId]; + if (!callbackInfo) return; // no callback or callback removed meanwhile + info.callbacks[callbackId] = null; // TODO: reuse callbackIds, compress this + var data = msg.data.data; + if (!data.byteLength) data = new Uint8Array(data); + if (!info.buffer || info.bufferSize < data.length) { + if (info.buffer) _free(info.buffer); + info.bufferSize = data.length; + info.buffer = _malloc(data.length); + } + HEAPU8.set(data, info.buffer); + callbackInfo.func(info.buffer, data.length, callbackInfo.arg); + }; + Browser.workers.push(info); + return id; + }, + + emscripten_destroy_worker: function(id) { + var info = Browser.workers[id]; + info.worker.terminate(); + if (info.buffer) _free(info.buffer); + Browser.workers[id] = null; + }, + + emscripten_call_worker: function(id, funcName, data, size, callback, arg) { + funcName = Pointer_stringify(funcName); + var info = Browser.workers[id]; + var callbackId = -1; + if (callback) { + callbackId = info.callbacks.length; + info.callbacks.push({ + func: Runtime.getFuncWrapper(callback), + arg: arg + }); + } + info.worker.postMessage({ + funcName: funcName, + callbackId: callbackId, + data: {{{ makeHEAPView('U8', 'data', 'data + size') }}} + }); + }, + + emscripten_worker_respond: function(data, size) { + if (!inWorkerCall) throw 'not in worker call!'; + if (workerResponded) throw 'already responded!'; + workerResponded = true; + postMessage({ + callbackId: workerCallbackId, + data: {{{ makeHEAPView('U8', 'data', 'data + size') }}} + }); } }); |