Skip to content

Instantly share code, notes, and snippets.

@dixia
Last active August 29, 2015 14:08
Show Gist options
  • Save dixia/a351ab65152c6e85092f to your computer and use it in GitHub Desktop.
Save dixia/a351ab65152c6e85092f to your computer and use it in GitHub Desktop.
emscripten malloc issue
//decompressionWorker.js
'use strict';
/*jslint worker: true*/
/*jslint browser: true*/
/*global decompress: false, Module: false*/
//get emscripten context
importScripts('function.js');
self.onmessage = function(e) {
var data = e.data;
if (!data.type || data.type !== 'compData') {
return;
}
var buffer = new Int16Array([1]);
//create an array in EM mem space so that a pointer can be passed
var nDataBytes = buffer.length * buffer.BYTES_PER_ELEMENT;
var ptr = Module._malloc(nDataBytes);
var bufferHeap = new Uint8Array(Module.HEAPU8.buffer, ptr, nDataBytes);
bufferHeap.set(new Uint8Array(buffer.buffer));
var bufferHeapResult = new Int16Array(bufferHeap.buffer, bufferHeap.byteOffset, buffer.length);
var arraybuffer = bufferHeapResult.buffer.slice(0);
// .slice(0);
Module._free(bufferHeap.byteOffset);
console.time('copy/tranfser data');
postMessage({
key: data.key,
type: 'data',
value: arraybuffer},
[arraybuffer] // transfer ownnership
);
console.timeEnd('copy/tranfser data');
};
'use strict';
//main.js
/*jslint worker: true*/
/*jslint browser: true*/
/*global compressedData: false, console: false, origData: false*/
//from http://stackoverflow.com/a/10101213/345265
if (!ArrayBuffer.prototype.slice) {
ArrayBuffer.prototype.slice = function (start, end) {
var that = new Uint8Array(this);
if (end === undefined) end = that.length;
var result = new ArrayBuffer(end - start);
var resultArray = new Uint8Array(result);
for (var i = 0; i < resultArray.length; i++)
resultArray[i] = that[i + start];
return result;
};
}
function sendDecompressiondMsgTo(selectedWorker,index) {
selectedWorker.postMessage({
type: 'compData',
key:index
});
}
function onWorkerMessagefunction(e) {
var data = e.data;
if (data.type == 'data') {
var result = data.value;
dataBlocks.push({
key: data.key,
data: result
});
}
}
function mWorkerTest(){
var n = 4;
var workers = [];
for (var i = 0; i < n; i++) {
var worker = new Worker('decompressionWorker.js');
worker.addEventListener('message', onWorkerMessagefunction, false);
workers.push(worker);
}
var workernr = 0;
console.log('start');
for (var j = 0; j < 1000; j++) {
workernr = (workernr+1) % n;
sendDecompressiondMsgTo(workers[workernr],j);
}
}
var dataBlocks = [];
//playground.htm
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Webworker Decoding PoC</title>
<!-- <script src="loadData.js"></script> -->
<script src="main.js"></script>
</head>
<body>
<button onclick="mWorkerTest()">N Worker test</button>
<output id="result"></output>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment