blob: 464f4956fd11b0c48c990474676fe0ecc367c977 [file] [log] [blame] [edit]
#include "Fetch.js"
if (typeof Atomics === 'undefined') {
// Polyfill singlethreaded atomics ops from http://lars-t-hansen.github.io/ecmascript_sharedmem/shmem.html#Atomics.add
// No thread-safety needed since we don't have multithreading support.
Atomics = {};
Atomics['add'] = function(t, i, v) { var w = t[i]; t[i] += v; return w; }
Atomics['and'] = function(t, i, v) { var w = t[i]; t[i] &= v; return w; }
Atomics['compareExchange'] = function(t, i, e, r) { var w = t[i]; if (w == e) t[i] = r; return w; }
Atomics['exchange'] = function(t, i, v) { var w = t[i]; t[i] = v; return w; }
Atomics['wait'] = function(t, i, v, o) { if (t[i] != v) return 'not-equal'; else return 'timed-out'; }
Atomics['wake'] = function(t, i, c) { return 0; }
Atomics['wakeOrRequeue'] = function(t, i1, c, i2, v) { return 0; }
Atomics['isLockFree'] = function(s) { return true; }
Atomics['load'] = function(t, i) { return t[i]; }
Atomics['or'] = function(t, i, v) { var w = t[i]; t[i] |= v; return w; }
Atomics['store'] = function(t, i, v) { t[i] = v; return v; }
Atomics['sub'] = function(t, i, v) { var w = t[i]; t[i] -= v; return w; }
Atomics['xor'] = function(t, i, v) { var w = t[i]; t[i] ^= v; return w; }
}
var Atomics_add = Atomics.add;
var Atomics_and = Atomics.and;
var Atomics_compareExchange = Atomics.compareExchange;
var Atomics_exchange = Atomics.exchange;
var Atomics_wait = Atomics.wait;
var Atomics_wake = Atomics.wake;
var Atomics_wakeOrRequeue = Atomics.wakeOrRequeue;
var Atomics_isLockFree = Atomics.isLockFree;
var Atomics_load = Atomics.load;
var Atomics_or = Atomics.or;
var Atomics_store = Atomics.store;
var Atomics_sub = Atomics.sub;
var Atomics_xor = Atomics.xor;
var ENVIRONMENT_IS_FETCH_WORKER = true;
var ENVIRONMENT_IS_WORKER = true;
var ENVIRONMENT_IS_PTHREAD = true;
var __pthread_is_main_runtime_thread=0;
var DYNAMICTOP_PTR = 0;
var TOTAL_MEMORY = 0;
function enlargeMemory() {
abort('Cannot enlarge memory arrays, since compiling with pthreads support enabled (-s USE_PTHREADS=1).');
}
var nan = NaN;
var inf = Infinity;
function _emscripten_asm_const_v() {}
function assert(condition) {
if (!condition) console.error('assert failure!');
}
/// TODO: DO SOMETHING ABOUT ME.
function Pointer_stringify(ptr, /* optional */ length) {
if (length === 0 || !ptr) return "";
// TODO: use TextDecoder
// Find the length, and check for UTF while doing so
var hasUtf = 0;
var t;
var i = 0;
while (1) {
t = HEAPU8[(((ptr)+(i))>>0)];
hasUtf |= t;
if (t == 0 && !length) break;
i++;
if (length && i == length) break;
}
if (!length) length = i;
var ret = "";
if (hasUtf < 128) {
var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack
var curr;
while (length > 0) {
curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));
ret = ret ? ret + curr : curr;
ptr += MAX_CHUNK;
length -= MAX_CHUNK;
}
return ret;
}
return Module['UTF8ToString'](ptr);
}
Fetch.staticInit();
var queuePtr = 0;
var buffer = null;
var STACKTOP = 0;
var STACK_MAX = 0;
var HEAP8 = null;
var HEAPU8 = null;
var HEAP16 = null;
var HEAPU16 = null;
var HEAP32 = null;
var HEAPU32 = null;
function processWorkQueue() {
if (!queuePtr) return;
var numQueuedItems = Atomics_load(HEAPU32, queuePtr + 4 >> 2);
if (numQueuedItems == 0) return;
var queuedOperations = Atomics_load(HEAPU32, queuePtr >> 2);
var queueSize = Atomics_load(HEAPU32, queuePtr + 8 >> 2);
for(var i = 0; i < numQueuedItems; ++i) {
var fetch = Atomics_load(HEAPU32, (queuedOperations >> 2)+i);
function successcb(fetch) {
Atomics.compareExchange(HEAPU32, fetch + Fetch.fetch_t_offset___proxyState >> 2, 1, 2);
Atomics.wake(HEAP32, fetch + Fetch.fetch_t_offset___proxyState >> 2, 1);
}
function errorcb(fetch) {
Atomics.compareExchange(HEAPU32, fetch + Fetch.fetch_t_offset___proxyState >> 2, 1, 2);
Atomics.wake(HEAP32, fetch + Fetch.fetch_t_offset___proxyState >> 2, 1);
}
function progresscb(fetch) {
}
try {
emscripten_start_fetch(fetch, successcb, errorcb, progresscb);
} catch(e) {
console.error(e);
}
/*
if (interval != undefined) {
clearInterval(interval);
interval = undefined;
}
*/
}
Atomics_store(HEAPU32, queuePtr + 4 >> 2, 0);
}
interval = 0;
this.onmessage = function(e) {
if (e.data.cmd == 'init') {
queuePtr = e.data.queuePtr;
buffer = e.data.buffer;
STACKTOP = e.data.STACKTOP;
STACK_MAX = e.data.STACK_MAX;
DYNAMICTOP_PTR = e.data.DYNAMICTOP_PTR;
TOTAL_MEMORY = e.data.TOTAL_MEMORY;
HEAP8 = new Int8Array(buffer);
HEAPU8 = new Uint8Array(buffer);
HEAP16 = new Int16Array(buffer);
HEAPU16 = new Uint16Array(buffer);
HEAP32 = new Int32Array(buffer);
HEAPU32 = new Uint32Array(buffer);
interval = setInterval(processWorkQueue, 100);
}
}