aboutsummaryrefslogtreecommitdiff
path: root/src/library_browser.js
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-10-22 15:30:03 -0700
committerAlon Zakai <alonzakai@gmail.com>2012-10-22 15:30:03 -0700
commite48db465e2a2f13b2e9c4797d3334fc6d2b29b6d (patch)
tree79937100322df639de1bc78b3f1d3dd25871650c /src/library_browser.js
parent11a4926fc6c2bfe43fef3c66ad30e4b2df612616 (diff)
initial work on worker api
Diffstat (limited to 'src/library_browser.js')
-rw-r--r--src/library_browser.js66
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') }}}
+ });
}
});