make sync_to_async threadsafe
diff --git a/system/include/emscripten/thread_utils.h b/system/include/emscripten/thread_utils.h index 81826d4..279f928 100644 --- a/system/include/emscripten/thread_utils.h +++ b/system/include/emscripten/thread_utils.h
@@ -98,6 +98,10 @@ // // In the async case, you would call resume() at some later time. // + // It is safe to call this method from multiple threads, as it locks itself. + // That is, you can create an instance of this and call it from multiple + // threads freely. + // void invoke(std::function<void(Callback)> newWork); //============================================================================== @@ -112,6 +116,7 @@ bool finishedWork; bool quit = false; std::unique_ptr<std::function<void()>> resume; + std::mutex invokeMutex; // The child will be asynchronous, and therefore we cannot rely on RAII to // unlock for us, we must do it manually. @@ -175,6 +180,10 @@ }; void sync_to_async::invoke(std::function<void(Callback)> newWork) { + // Use the invokeMutex to prevent more than one invoke being in flight at a + // time, so that this is usable from multiple threads safely. + std::lock_guard<std::mutex> invokeLock(invokeMutex); + // Send the work over. { std::lock_guard<std::mutex> lock(mutex);