Hi friends,
Recently, I hit an issue during my developing with emscripten.* I found it
was different to terminate workers when there were some errors in the
worker.*
I use below params to generate related files: test.js, test.worker.js,
test.wasm
```
LINKFLAGS=[
'--js-library', webCodecsLibrary.abspath,
'-lembind',
'-sINITIAL_MEMORY=1GB',
'-sEXPORTED_FUNCTIONS=%s' % ','.join(exportedFunctions),
'-sEXPORTED_RUNTIME_METHODS=%s' % ','.join(exportedRuntime),
'-sEXPORT_ES6=1',
'-sMODULARIZE=1',
'-sENVIRONMENT=web,worker',
'-sPTHREAD_POOL_SIZE=8',
'-sDYNAMIC_EXECUTION=0',
])
```
I need to test a scenario where the network is disconnected. I've observed
that even when the network is disconnected, workers are still created.
However, due to the failure to load files within the worker, loading the
WebAssembly module fails, and as a result, the worker persists. I'd like to
know how to terminate these workers.
Found killThread codes in test.js, but I don't know how post a killThread
message from worker.
worker.onmessage = (e) => {
var d = e['data'];
var cmd = d['cmd'];
// Sometimes we need to backproxy events to the calling thread (e.g.
// HTML5 DOM events handlers such as
// emscripten_set_mousemove_callback()), so keep track in a globally
// accessible variable about the thread that initiated the proxying.
if (worker.pthread_ptr) PThread.currentProxiedOperationCallerThread = worker
.pthread_ptr;
// If this message is intended to a recipient that is not the main thread,
forward it to the target thread.
if (d['targetThread'] && d['targetThread'] != _pthread_self()) {
var targetWorker = PThread.pthreads[d.targetThread];
if (targetWorker) {
targetWorker.postMessage(d, d['transferList']);
} else {
err('Internal error! Worker sent a message "' + cmd + '" to target pthread '
+ d['targetThread'] + ', but that thread no longer exists!');
}
PThread.currentProxiedOperationCallerThread = undefined;
return;
}
if (cmd === 'processProxyingQueue') {
executeNotifiedProxyingQueue(d['queue']);
} else if (cmd === 'spawnThread') {
spawnThread(d);
} else if (cmd === 'cleanupThread') {
cleanupThread(d['thread']);
} else if (cmd === 'killThread') {
killThread(d['thread']);
} else if (cmd === 'cancelThread') {
cancelThread(d['thread']);
} else if (cmd === 'loaded') {
worker.loaded = true;
onFinishedLoading(worker);
} else if (cmd === 'print') {
out('Thread ' + d['threadId'] + ': ' + d['text']);
} else if (cmd === 'printErr') {
err('Thread ' + d['threadId'] + ': ' + d['text']);
} else if (cmd === 'alert') {
alert('Thread ' + d['threadId'] + ': ' + d['text']);
} else if (d.target === 'setimmediate') {
// Worker wants to postMessage() to itself to implement setImmediate()
// emulation.
worker.postMessage(d);
} else if (cmd === 'callHandler') {
Module[d['handler']](...d['args']);
} else if (cmd) {
// The received message looks like something that should be handled by this
message
// handler, (since there is a e.data.cmd field present), but is not one of
the
// recognized commands:
err("worker sent an unknown command " + cmd);
}
PThread.currentProxiedOperationCallerThread = undefined;
};
--
You received this message because you are subscribed to the Google Groups
"emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/emscripten-discuss/94599059-a27e-4a4b-a19b-1bec2334e729n%40googlegroups.com.