Last active
August 29, 2015 14:08
-
-
Save dixia/a351ab65152c6e85092f to your computer and use it in GitHub Desktop.
emscripten malloc issue
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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