> I don't see any example code in the emscripten SDK that covers pthreads and asynchronous JavaScript, so I doubt this is something that's even tested, which seems unfortunate.
We do have tests on this, and they pass. For example, browser.test_emscripten_main_loop tests the main loop with PROXY_TO_PTHREAD (which means that the C main() function runs in a pthread), and a bunch of other tests cover other async operations. It is possible you've found an unknown bug. If so please reduce it to a small testcase and submit that. - Alon On Thu, Mar 26, 2020 at 12:30 PM Kevin McGrath <[email protected]> wrote: > Well, in my C++ pthread tick function I tried performing a call > to emscripten_cancel_main_loop() and then > called emscripten_set_main_loop_arg(WasmHTTPRequestMainLoop, this, 10, 0), > however my new main loop for this thread is never called, and my pthread > tick function kept ticking. > > I would expect my new C main loop function to take over for my old pthread > C++ main loop, but in fact nothing happened. It just kept calling my > original pthread C++ tick function. > > I don't see any example code in the emscripten SDK that covers pthreads > and asynchronous JavaScript, so I doubt this is something that's even > tested, which seems unfortunate. > > Again, Asyncify doesn't sound like a solution, especially not if I have to > write some JavaScript system to multiplex N number of asynchronous > JavaScript functions. It'll bloat the game code, or make debugging > impossible, and I still don't get truly asynchronous JavaScript out of it > (I would consider one function running at a time on a multi-core device to > be pseudo-asynchronous anyway). > > It's quickly looking like right now we can't have asynchronous JavaScript > code if we use pthreads. :( > > On Thursday, March 26, 2020 at 11:24:39 AM UTC-7, Alon Zakai wrote: >> >> > I'm not sure I understand how emscripten_set_main_loop() will help my >> JavaScript execute the async code... are you saying that the compiled code >> in each thread is blocking the JavaScript code? >> >> Yes, see >> >> >> https://emscripten.org/docs/porting/emscripten-runtime-environment.html?#browser-main-loop >> >> if you have a "while (1)" loop as in the example there, then it never >> exits back to the JS event loop. All execution has to stop for that to >> happen. That's the same on the main thread and on workers, and the solution >> can be the same, as described there. >> >> About Asyncify: I think most of your worries are not an issue (it works >> with pthreads, and you can implement multiple async events at once, but you >> need to add a little JS layer yourself to multiplex them, etc.). But if you >> can just switch to using emscripten_set_main_loop() or some other async way >> of doing your main loop, that would be much simpler and much better. >> >> >> >> On Wed, Mar 25, 2020 at 5:51 PM Kevin McGrath <[email protected]> >> wrote: >> >>> Ah! Thanks for the details! I looked into Asyncify and ruled it out >>> because of this from the emscripten documentation: >>> >>> It is not safe to start an async operation while another is already >>>> running. The first must complete before the second begins. >>> >>> >>> That would mean one HTTP request at a time, one after another, and any >>> time we want to use Asyncify for any other async JavaScript tasks we may >>> run into trouble that would be a nightmare to debug. Plus there's more >>> issues described in that doc, such as if we get an event (like a keypress) >>> while the async JavaScript is running it doesn't sound too stable when it >>> calls into compiled code. Lastly, they mention that you should always run >>> optimized builds if you're using Asyncify, which will not be fun to debug. >>> Taking all of that into consideration, it didn't sound like a good option >>> to me, especially since I wasn't sure it would work in the first place with >>> USE_PTHREADS=1. >>> >>> I'm not sure I understand how emscripten_set_main_loop() will help my >>> JavaScript execute the async code... are you saying that the compiled code >>> in each thread is blocking the JavaScript code? >>> >>> Sorry for so many questions, I'm very new to JavaScript and know very >>> little about its internal workings. Also seems impossible to Google for >>> this kind of stuff. >>> >>> Thank you! >>> >>> >>> On Wednesday, March 25, 2020 at 4:39:29 PM UTC-7, Alon Zakai wrote: >>>> >>>> emscripten_thread_sleep() will check the pthread event queue, which >>>> means it can receive C messages from other threads - those are synchronized >>>> using shared memory. However, it can't help with JS events, as to get those >>>> to happen you need to actually return to the main JS event loop. The >>>> browser won't run those events otherwise. >>>> >>>> To do that, you can use Asyncify ( >>>> https://emscripten.org/docs/porting/asyncify.html) and >>>> emscripten_sleep(). Or, you can manually return to the main event loop >>>> yourself, replacing an infinite event loop with an >>>> emscripten_set_main_loop() etc. >>>> >>>> On Wed, Mar 25, 2020 at 1:56 PM Kevin McGrath <[email protected]> >>>> wrote: >>>> >>>>> Hello! >>>>> >>>>> I'm hoping someone has already run into this before and can tell me >>>>> what I'm doing wrong... >>>>> >>>>> I have a JavaScript function I'm calling from a C++ multi-threaded >>>>> game that is designed to perform an async HTTP fetch. >>>>> >>>>> I'm building the game using USE_PTHREADS=1 and PROXY_TO_PTHREAD=1 and >>>>> I've tried both having the JavaScript function embedded in a EM_JS() and >>>>> in >>>>> a --js-library. The C++ code sparks off a pthread and calls into the >>>>> JavaScript function, and that JavaScript code executes and then returns >>>>> back to the C++ code. What doesn't work is any of the Promise / await >>>>> code, nothing is executing in those code blocks. >>>>> >>>>> I've tried calling emscripten_thread_sleep() from the C++ code, which >>>>> is still executing in the thread waiting on the JavaScript asynchronous >>>>> code to call it back, it just never happens. The network request is just >>>>> marked as "(pending)" in Chrome and never changes. >>>>> >>>>> So my question is, what's the right way to run Promise/async/await >>>>> code in a WebAssembly pthread/Web Worker? >>>>> >>>>> Thank you!! >>>>> >>>>> -- >>>>> 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/aecd43c5-6662-4d7d-bb8c-15461e75522e%40googlegroups.com >>>>> <https://groups.google.com/d/msgid/emscripten-discuss/aecd43c5-6662-4d7d-bb8c-15461e75522e%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> >>>> -- >>> 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/fe4d60af-6a74-40e6-b37f-31a04eb34afd%40googlegroups.com >>> <https://groups.google.com/d/msgid/emscripten-discuss/fe4d60af-6a74-40e6-b37f-31a04eb34afd%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >> -- > 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/d4918085-f6bc-4912-94a1-3412763525fe%40googlegroups.com > <https://groups.google.com/d/msgid/emscripten-discuss/d4918085-f6bc-4912-94a1-3412763525fe%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- 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/CAEX4NpSKin7B_gAsydV3FiqrKFZLHWdQNu%3Dn8-aJdcJiDozj3Q%40mail.gmail.com.
