diff --git a/src/lib/libeventloop.js b/src/lib/libeventloop.js index f823dec81ce06..917e07a5b7d9d 100644 --- a/src/lib/libeventloop.js +++ b/src/lib/libeventloop.js @@ -65,19 +65,24 @@ LibraryJSEventLoop = { var __setImmediate_cb = (e) => { if (e.data === __setImmediate_message_id) { e.stopPropagation(); - __setImmediate_queue.shift()(); + __setImmediate_queue.shift()?.(); ++__setImmediate_id_counter; } } addEventListener("message", __setImmediate_cb, true); emSetImmediate = (func) => { +#if PTHREADS + if (ENVIRONMENT_IS_WORKER) { + postMessage(__setImmediate_message_id); + } else +#endif postMessage(__setImmediate_message_id, "*"); return __setImmediate_id_counter + __setImmediate_queue.push(func) - 1; } emClearImmediate = /**@type{function(number=)}*/((id) => { var index = id - __setImmediate_id_counter; // must preserve the order and count of elements in the queue, so replace the pending callback with an empty function - if (index >= 0 && index < __setImmediate_queue.length) __setImmediate_queue[index] = () => {}; + if (index >= 0 && index < __setImmediate_queue.length) __setImmediate_queue[index] = null; }) }`, $emSetImmediate: undefined, diff --git a/src/lib/libpthread.js b/src/lib/libpthread.js index c60aec74feb4a..1a6e92bf9eb38 100644 --- a/src/lib/libpthread.js +++ b/src/lib/libpthread.js @@ -293,7 +293,7 @@ var LibraryPThread = { return; } - if (d === 'setimmediate') { + if (d === 'setimmediate' || d === '_si') { // Worker wants to postMessage() to itself to implement setImmediate() // emulation. worker.postMessage(d); diff --git a/test/codesize/test_codesize_minimal_pthreads.json b/test/codesize/test_codesize_minimal_pthreads.json index 291a3a52fede4..57b8c99f35738 100644 --- a/test/codesize/test_codesize_minimal_pthreads.json +++ b/test/codesize/test_codesize_minimal_pthreads.json @@ -1,10 +1,10 @@ { - "a.out.js": 7143, - "a.out.js.gz": 3542, + "a.out.js": 7154, + "a.out.js.gz": 3549, "a.out.nodebug.wasm": 19037, "a.out.nodebug.wasm.gz": 8787, - "total": 26180, - "total_gz": 12329, + "total": 26191, + "total_gz": 12336, "sent": [ "a (memory)", "b (exit)", diff --git a/test/codesize/test_codesize_minimal_pthreads_memgrowth.json b/test/codesize/test_codesize_minimal_pthreads_memgrowth.json index cca8bd65756ed..770e5d5d29c11 100644 --- a/test/codesize/test_codesize_minimal_pthreads_memgrowth.json +++ b/test/codesize/test_codesize_minimal_pthreads_memgrowth.json @@ -1,10 +1,10 @@ { - "a.out.js": 7551, - "a.out.js.gz": 3745, + "a.out.js": 7562, + "a.out.js.gz": 3752, "a.out.nodebug.wasm": 19038, "a.out.nodebug.wasm.gz": 8788, - "total": 26589, - "total_gz": 12533, + "total": 26600, + "total_gz": 12540, "sent": [ "a (memory)", "b (exit)", diff --git a/test/test_browser.py b/test/test_browser.py index c3fe8de49d17a..31b3d16d04ac4 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -4875,8 +4875,12 @@ def test_emscripten_set_timeout(self): def test_emscripten_set_timeout_loop(self): self.btest_exit('emscripten_set_timeout_loop.c', cflags=['-pthread', '-sPROXY_TO_PTHREAD']) - def test_emscripten_set_immediate(self): - self.btest_exit('emscripten_set_immediate.c') + @parameterized({ + '': ([],), + 'pthread': (['-pthread', '-sPROXY_TO_PTHREAD'],), + }) + def test_emscripten_set_immediate(self, args): + self.btest_exit('emscripten_set_immediate.c', cflags=args) def test_emscripten_set_immediate_loop(self): self.btest_exit('emscripten_set_immediate_loop.c')