diff --git a/eng/testing/tests.browser.targets b/eng/testing/tests.browser.targets index cefc5b3b52caae..0db156f0ec40be 100644 --- a/eng/testing/tests.browser.targets +++ b/eng/testing/tests.browser.targets @@ -127,10 +127,14 @@ <_AppArgs Condition="'$(WasmTestAppArgs)' != ''">$(_AppArgs) $(WasmTestAppArgs) $(WasmXHarnessMonoArgs) --setenv=XHARNESS_LOG_TEST_START=true - - $(WasmXHarnessMonoArgs) --setenv=IsBrowserThreadingSupported=true 8 + + + + + + <_XHarnessArgs Condition="'$(OS)' != 'Windows_NT'">wasm $XHARNESS_COMMAND --app=. --output-directory=$XHARNESS_OUT @@ -148,7 +152,9 @@ <_XHarnessArgs Condition="'$(WasmXHarnessVerbosity)' != ''" >$(_XHarnessArgs) --verbosity=$(WasmXHarnessVerbosity) <_XHarnessArgs Condition="'$(WasmXHarnessArgsCli)' != ''" >$(_XHarnessArgs) $(WasmXHarnessArgsCli) + <_AppArgs Condition="'$(WasmXHarnessMaxParallelThreads)' != ''">$(_AppArgs) -parallelThreads $(WasmXHarnessMaxParallelThreads) $HARNESS_RUNNER $(_XHarnessArgs) %24XHARNESS_ARGS %24WasmXHarnessArgs -- $(WasmXHarnessMonoArgs) %24WasmXHarnessMonoArgs $(_AppArgs) %24WasmTestAppArgs diff --git a/src/libraries/System.Net.Http/tests/FunctionalTests/System.Net.Http.Functional.Tests.csproj b/src/libraries/System.Net.Http/tests/FunctionalTests/System.Net.Http.Functional.Tests.csproj index b699cc0dafd7fd..28306cba768a64 100644 --- a/src/libraries/System.Net.Http/tests/FunctionalTests/System.Net.Http.Functional.Tests.csproj +++ b/src/libraries/System.Net.Http/tests/FunctionalTests/System.Net.Http.Functional.Tests.csproj @@ -29,7 +29,7 @@ $(DefineConstants);TARGET_BROWSER 01:15:00 - true + true diff --git a/src/libraries/System.Net.WebSockets.Client/tests/System.Net.WebSockets.Client.Tests.csproj b/src/libraries/System.Net.WebSockets.Client/tests/System.Net.WebSockets.Client.Tests.csproj index 83cf148c6a9fd6..49690818a4c74c 100644 --- a/src/libraries/System.Net.WebSockets.Client/tests/System.Net.WebSockets.Client.Tests.csproj +++ b/src/libraries/System.Net.WebSockets.Client/tests/System.Net.WebSockets.Client.Tests.csproj @@ -17,7 +17,7 @@ $(TestArchiveTestsRoot)$(OSPlatformConfig)/ $(DefineConstants);TARGET_BROWSER 1 - true + true diff --git a/src/libraries/System.Runtime.InteropServices.JavaScript/tests/System.Runtime.InteropServices.JavaScript.UnitTests/System.Runtime.InteropServices.JavaScript.Tests.csproj b/src/libraries/System.Runtime.InteropServices.JavaScript/tests/System.Runtime.InteropServices.JavaScript.UnitTests/System.Runtime.InteropServices.JavaScript.Tests.csproj index 15e2c682f6ecab..d5a40b9c28f982 100644 --- a/src/libraries/System.Runtime.InteropServices.JavaScript/tests/System.Runtime.InteropServices.JavaScript.UnitTests/System.Runtime.InteropServices.JavaScript.Tests.csproj +++ b/src/libraries/System.Runtime.InteropServices.JavaScript/tests/System.Runtime.InteropServices.JavaScript.UnitTests/System.Runtime.InteropServices.JavaScript.Tests.csproj @@ -10,11 +10,10 @@ $(WasmXHarnessMonoArgs) --setenv=TZ=Europe/Berlin true true - $(DefineConstants);FEATURE_WASM_MANAGED_THREADS true 1 - true + true $(NoWarn);IL2103;IL2025;IL2111;IL2122 true + diff --git a/src/mono/browser/browser.proj b/src/mono/browser/browser.proj index b9f72ca324b0fd..93a3f0bd930ccf 100644 --- a/src/mono/browser/browser.proj +++ b/src/mono/browser/browser.proj @@ -142,6 +142,7 @@ + diff --git a/src/mono/browser/build/BrowserWasmApp.targets b/src/mono/browser/build/BrowserWasmApp.targets index ea0b33bb83ebeb..32541ff00fd668 100644 --- a/src/mono/browser/build/BrowserWasmApp.targets +++ b/src/mono/browser/build/BrowserWasmApp.targets @@ -309,6 +309,9 @@ + + + <_WasmEHLib Condition="'$(WasmEnableExceptionHandling)' == 'true'">libmono-wasm-eh-wasm.a <_WasmEHLib Condition="'$(WasmEnableExceptionHandling)' != 'true'">libmono-wasm-eh-js.a diff --git a/src/mono/browser/runtime/cwraps.ts b/src/mono/browser/runtime/cwraps.ts index 1acc3e00204907..6a4f602484a990 100644 --- a/src/mono/browser/runtime/cwraps.ts +++ b/src/mono/browser/runtime/cwraps.ts @@ -27,6 +27,7 @@ const threading_cwraps: SigLine[] = WasmEnableThreads ? [ [true, "mono_wasm_print_thread_dump", "void", []], [true, "mono_wasm_synchronization_context_pump", "void", []], [true, "mono_threads_wasm_sync_run_in_target_thread_done", "void", ["number"]], + [true, "pthread_self", "number", []], ] : []; // when the method is assigned/cached at usage, instead of being invoked directly from cwraps, it can't be marked lazy, because it would be re-bound on each call @@ -149,6 +150,7 @@ export interface t_ThreadingCwraps { mono_wasm_print_thread_dump(): void; mono_wasm_synchronization_context_pump(): void; mono_threads_wasm_sync_run_in_target_thread_done(sem: VoidPtr): void; + pthread_self(): PThreadPtr; } export interface t_ProfilerCwraps { diff --git a/src/mono/browser/runtime/loader/assets.ts b/src/mono/browser/runtime/loader/assets.ts index 76b3291d7de9f9..b23d66a3eac962 100644 --- a/src/mono/browser/runtime/loader/assets.ts +++ b/src/mono/browser/runtime/loader/assets.ts @@ -793,6 +793,9 @@ export function preloadWorkers () { threadPrefix: worker_empty_prefix, threadName: "emscripten-pool", } as any; + worker.queue = []; + worker.handler = (ev) => worker.queue!.push(ev); + worker.addEventListener!("message", worker.handler); loadingWorkers.push(worker as any); } loaderHelpers.loadingWorkers.promise_control.resolve(loadingWorkers); diff --git a/src/mono/browser/runtime/loader/config.ts b/src/mono/browser/runtime/loader/config.ts index 36128ce2230754..e0618be5918a46 100644 --- a/src/mono/browser/runtime/loader/config.ts +++ b/src/mono/browser/runtime/loader/config.ts @@ -201,7 +201,7 @@ export function normalizeConfig () { if (WasmEnableThreads) { if (!Number.isInteger(config.pthreadPoolInitialSize)) { - config.pthreadPoolInitialSize = 5; + config.pthreadPoolInitialSize = 7; } if (!Number.isInteger(config.pthreadPoolUnusedSize)) { config.pthreadPoolUnusedSize = 1; diff --git a/src/mono/browser/runtime/loader/run.ts b/src/mono/browser/runtime/loader/run.ts index ba803cc29d87de..b11bfddd8716e6 100644 --- a/src/mono/browser/runtime/loader/run.ts +++ b/src/mono/browser/runtime/loader/run.ts @@ -451,19 +451,11 @@ async function createEmscriptenWorker (): Promise { await loaderHelpers.afterConfigLoaded.promise; prepareAssetsWorker(); - - setTimeout(async () => { - try { - // load subset which is on JS heap rather than in WASM linear memory - await mono_download_assets(); - } catch (err) { - mono_exit(1, err); - } - }, 0); - const promises = importModules(); const es6Modules = await Promise.all(promises); await initializeModules(es6Modules as any); + await mono_download_assets(); + return emscriptenModule; } diff --git a/src/mono/browser/runtime/loader/worker.ts b/src/mono/browser/runtime/loader/worker.ts index c171211c0c6d8f..05bc8655ff931c 100644 --- a/src/mono/browser/runtime/loader/worker.ts +++ b/src/mono/browser/runtime/loader/worker.ts @@ -2,9 +2,8 @@ // The .NET Foundation licenses this file to you under the MIT license. import { MonoConfigInternal, PThreadInfo, WorkerToMainMessageType, monoMessageSymbol } from "../types/internal"; -import { MonoConfig } from "../types"; import { deep_merge_config, normalizeConfig } from "./config"; -import { ENVIRONMENT_IS_WEB, loaderHelpers, runtimeHelpers } from "./globals"; +import { emscriptenModule, ENVIRONMENT_IS_WEB, loaderHelpers, runtimeHelpers } from "./globals"; import { mono_log_debug } from "./logging"; export function setupPreloadChannelToMainThread () { @@ -12,9 +11,7 @@ export function setupPreloadChannelToMainThread () { const workerPort = channel.port1; const mainPort = channel.port2; workerPort.addEventListener("message", (event) => { - const config = JSON.parse(event.data.config) as MonoConfig; - const monoThreadInfo = JSON.parse(event.data.monoThreadInfo) as PThreadInfo; - onMonoConfigReceived(config, monoThreadInfo); + onMonoConfigReceived(event.data); workerPort.close(); mainPort.close(); }, { once: true }); @@ -31,7 +28,13 @@ export function setupPreloadChannelToMainThread () { let workerMonoConfigReceived = false; // called when the main thread sends us the mono config -function onMonoConfigReceived (config: MonoConfigInternal, monoThreadInfo: PThreadInfo): void { +function onMonoConfigReceived (data: any): void { + const config = JSON.parse(data.config) as MonoConfigInternal; + const monoThreadInfo = JSON.parse(data.monoThreadInfo) as PThreadInfo; + emscriptenModule.config = config; + emscriptenModule.wasmModule = data.wasmModule; + emscriptenModule.wasmMemory = data.wasmMemory; + emscriptenModule.handlers = data.handlers; if (workerMonoConfigReceived) { mono_log_debug("mono config already received"); return; diff --git a/src/mono/browser/runtime/pthreads/index.ts b/src/mono/browser/runtime/pthreads/index.ts index 484f66ddf3c9aa..953412e8043193 100644 --- a/src/mono/browser/runtime/pthreads/index.ts +++ b/src/mono/browser/runtime/pthreads/index.ts @@ -6,7 +6,7 @@ import { utf16ToString } from "../strings"; export { mono_wasm_main_thread_ptr, - mono_wasm_pthread_ptr, update_thread_info, isMonoThreadMessage, monoThreadInfo, + update_thread_info, isMonoThreadMessage, monoThreadInfo, } from "./shared"; export { SystemInteropJS_InstallWebWorkerInteropImpl, SystemInteropJS_UninstallWebWorkerInterop } from "./worker-interop"; export { diff --git a/src/mono/browser/runtime/pthreads/shared.ts b/src/mono/browser/runtime/pthreads/shared.ts index 93e62b0a289191..3596bcf47b4edf 100644 --- a/src/mono/browser/runtime/pthreads/shared.ts +++ b/src/mono/browser/runtime/pthreads/shared.ts @@ -89,11 +89,6 @@ export function mono_wasm_schedule_synchronization_context (): void { Module.safeSetTimeout(exec_synchronization_context_pump, 0); } -export function mono_wasm_pthread_ptr (): PThreadPtr { - if (!WasmEnableThreads) return PThreadPtrNull; - return (Module)["_pthread_self"](); -} - export function mono_wasm_main_thread_ptr (): PThreadPtr { if (!WasmEnableThreads) return PThreadPtrNull; return (Module)["_emscripten_main_runtime_thread_id"](); diff --git a/src/mono/browser/runtime/pthreads/ui-thread.ts b/src/mono/browser/runtime/pthreads/ui-thread.ts index b9036aecfbeae6..8a2e4f7fed7fe9 100644 --- a/src/mono/browser/runtime/pthreads/ui-thread.ts +++ b/src/mono/browser/runtime/pthreads/ui-thread.ts @@ -5,10 +5,11 @@ import WasmEnableThreads from "consts:wasmEnableThreads"; import BuildConfiguration from "consts:configuration"; import { } from "../globals"; -import { MonoWorkerToMainMessage, monoThreadInfo, mono_wasm_pthread_ptr, update_thread_info, worker_empty_prefix } from "./shared"; +import { MonoWorkerToMainMessage, monoThreadInfo, update_thread_info, worker_empty_prefix } from "./shared"; import { Module, ENVIRONMENT_IS_WORKER, createPromiseController, loaderHelpers, mono_assert, runtimeHelpers } from "../globals"; import { PThreadLibrary, MainToWorkerMessageType, MonoThreadMessage, PThreadInfo, PThreadPtr, PThreadPtrNull, PThreadWorker, PromiseController, Thread, WorkerToMainMessageType, monoMessageSymbol } from "../types/internal"; import { mono_log_info, mono_log_debug, mono_log_warn } from "../logging"; +import { threads_c_functions as tcwraps } from "../cwraps"; const threadPromises: Map[]> = new Map(); @@ -53,7 +54,7 @@ export function resolveThreadPromises (pthreadPtr: PThreadPtr, thread?: Thread): } // handler that runs in the main thread when a message is received from a pthread worker -function monoWorkerMessageHandler (worker: PThreadWorker, ev: MessageEvent): void { +function monoWorkerMessageHandler (worker: PThreadWorker, wasmModule: WebAssembly.Module, ev: MessageEvent): void { if (!WasmEnableThreads) return; let pthreadId: PThreadPtr; // this is emscripten message @@ -76,13 +77,26 @@ function monoWorkerMessageHandler (worker: PThreadWorker, ev: MessageEvent) worker.info = Object.assign({}, worker.info, message.info); switch (message.monoCmd) { case WorkerToMainMessageType.preload: - // this one shot port from setupPreloadChannelToMainThread - message.port!.postMessage({ - type: "pthread", - cmd: MainToWorkerMessageType.applyConfig, - config: JSON.stringify(runtimeHelpers.config), - monoThreadInfo: JSON.stringify(worker.info), - }); + { + const wasmMemory = runtimeHelpers.getMemory(); + const handlers = []; + const knownHandlers = ["onExit", "onAbort", "print", "printErr"]; + for (const handler of knownHandlers) { + if (Object.prototype.propertyIsEnumerable.call(Module, handler)) { + handlers.push(handler); + } + } + // this one shot port from setupPreloadChannelToMainThread + message.port!.postMessage({ + type: "pthread", + cmd: MainToWorkerMessageType.applyConfig, + config: JSON.stringify(runtimeHelpers.config), + monoThreadInfo: JSON.stringify(worker.info), + handlers, + wasmMemory, + wasmModule + }); + } break; case WorkerToMainMessageType.pthreadCreated: thread = new ThreadImpl(pthreadId, worker, message.port!); @@ -117,17 +131,6 @@ function monoWorkerMessageHandler (worker: PThreadWorker, ev: MessageEvent) } } -/// Called by Emscripten internals on the browser thread when a new pthread worker is created and added to the pthread worker pool. -/// At this point the worker doesn't have any pthread assigned to it, yet. -export function onWorkerLoadInitiated (worker: PThreadWorker, loaded: Promise): void { - if (!WasmEnableThreads) return; - worker.addEventListener("message", (ev) => monoWorkerMessageHandler(worker, ev)); - loaded.then(() => { - worker.info.isLoaded = true; - }); -} - - export async function populateEmscriptenPool (): Promise { if (!WasmEnableThreads) return; const unused = getUnusedWorkerPool(); @@ -142,7 +145,7 @@ export async function mono_wasm_init_threads () { if (!WasmEnableThreads) return; // setup the UI thread - runtimeHelpers.currentThreadTID = monoThreadInfo.pthreadId = mono_wasm_pthread_ptr(); + runtimeHelpers.currentThreadTID = monoThreadInfo.pthreadId = tcwraps.pthread_self(); monoThreadInfo.threadName = "UI Thread"; monoThreadInfo.isUI = true; monoThreadInfo.isRunning = true; @@ -211,8 +214,25 @@ export function replaceEmscriptenPThreadUI (modulePThread: PThreadLibrary): void const originalReturnWorkerToPool = modulePThread.returnWorkerToPool; modulePThread.loadWasmModuleToWorker = (worker: PThreadWorker): Promise => { + const afterLoaded = originalLoadWasmModuleToWorker(worker); - onWorkerLoadInitiated(worker, afterLoaded); + afterLoaded.then(() => { + worker.info.isLoaded = true; + }); + + loaderHelpers.wasmCompilePromise.promise.then((wasmModule) => { + // Stop queueing once we can process messages synchronously. + for (const queuedEvent of worker.queue) { + monoWorkerMessageHandler(worker, wasmModule, queuedEvent); + } + worker.queue.length = 0; + if (worker.handler) { + worker.removeEventListener("message", worker.handler); + } + worker.handler = (ev) => monoWorkerMessageHandler(worker, wasmModule, ev); + worker.addEventListener("message", worker.handler); + }); + if (loaderHelpers.config.exitOnUnhandledError) { worker.onerror = (e) => { loaderHelpers.mono_exit(1, e); @@ -299,6 +319,9 @@ function allocateUnusedWorker (): PThreadWorker { threadPrefix: worker_empty_prefix, threadName: "emscripten-pool", }; + worker.queue = []; + worker.handler = (ev) => worker.queue!.push(ev); + worker.addEventListener!("message", worker.handler); return worker; } diff --git a/src/mono/browser/runtime/pthreads/worker-thread.ts b/src/mono/browser/runtime/pthreads/worker-thread.ts index 5b2a0b551ced5e..7121a59e26d402 100644 --- a/src/mono/browser/runtime/pthreads/worker-thread.ts +++ b/src/mono/browser/runtime/pthreads/worker-thread.ts @@ -6,7 +6,7 @@ import WasmEnableThreads from "consts:wasmEnableThreads"; import { ENVIRONMENT_IS_PTHREAD, Module, loaderHelpers, mono_assert, runtimeHelpers } from "../globals"; -import { PThreadSelf, monoThreadInfo, mono_wasm_pthread_ptr, postMessageToMain, update_thread_info } from "./shared"; +import { PThreadSelf, monoThreadInfo, postMessageToMain, update_thread_info } from "./shared"; import { PThreadLibrary, MonoThreadMessage, PThreadInfo, PThreadPtr, WorkerToMainMessageType } from "../types/internal"; import { makeWorkerThreadEvent, @@ -14,11 +14,13 @@ import { dotnetPthreadAttached, WorkerThreadEventTarget } from "./worker-events"; -import { postRunWorker, preRunWorker } from "../startup"; +import { postRunWorker } from "../startup"; import { mono_log_debug, mono_log_error } from "../logging"; import { CharPtr } from "../types/emscripten"; import { utf8ToString } from "../strings"; import { forceThreadMemoryViewRefresh } from "../memory"; +import { threads_c_functions as tcwraps } from "../cwraps"; +import { jiterpreter_allocate_tables } from "../jiterpreter-support"; // re-export some of the events types export { @@ -80,13 +82,13 @@ export function mono_wasm_pthread_on_pthread_created (): void { if (!WasmEnableThreads) return; try { forceThreadMemoryViewRefresh(); - const pthread_id = mono_wasm_pthread_ptr(); - mono_assert(pthread_id == monoThreadInfo.pthreadId, `needs to match (mono_wasm_pthread_ptr ${pthread_id}, threadId from thread info ${monoThreadInfo.pthreadId})`); + monoThreadInfo.pthreadId = tcwraps.pthread_self(); monoThreadInfo.reuseCount++; monoThreadInfo.updateCount++; monoThreadInfo.threadName = "pthread-assigned"; update_thread_info(); + jiterpreter_allocate_tables(); // don't do this callback for the main thread if (!ENVIRONMENT_IS_PTHREAD) return; @@ -128,7 +130,7 @@ export function mono_wasm_pthread_on_pthread_registered (pthread_id: PThreadPtr) monoCmd: WorkerToMainMessageType.monoRegistered, info: monoThreadInfo, }); - preRunWorker(); + runtimeHelpers.runtimeReady = true; } catch (err) { mono_log_error("mono_wasm_pthread_on_pthread_registered () failed", err); loaderHelpers.mono_exit(1, err); diff --git a/src/mono/browser/runtime/startup.ts b/src/mono/browser/runtime/startup.ts index 25093725766169..343283935a6cda 100644 --- a/src/mono/browser/runtime/startup.ts +++ b/src/mono/browser/runtime/startup.ts @@ -5,7 +5,7 @@ import WasmEnableThreads from "consts:wasmEnableThreads"; import BuildConfiguration from "consts:configuration"; import { DotnetModuleInternal, CharPtrNull, MainToWorkerMessageType } from "./types/internal"; -import { exportedRuntimeAPI, INTERNAL, loaderHelpers, Module, runtimeHelpers, createPromiseController, mono_assert, browserVirtualAppBase } from "./globals"; +import { exportedRuntimeAPI, INTERNAL, loaderHelpers, Module, runtimeHelpers, mono_assert, browserVirtualAppBase } from "./globals"; import cwraps, { init_c_exports, threads_c_functions as tcwraps } from "./cwraps"; import { mono_wasm_raise_debug_event, mono_wasm_runtime_ready } from "./debug"; import { toBase64StringImpl } from "./base64"; @@ -25,7 +25,7 @@ import { mono_log_debug, mono_log_error, mono_log_info, mono_log_warn } from "./ // threads import { populateEmscriptenPool, mono_wasm_init_threads } from "./pthreads"; import { currentWorkerThreadEvents, dotnetPthreadCreated, initWorkerThreadEvents, monoThreadInfo } from "./pthreads"; -import { mono_wasm_pthread_ptr, update_thread_info } from "./pthreads"; +import { update_thread_info } from "./pthreads"; import { jiterpreter_allocate_tables } from "./jiterpreter-support"; import { localHeapViewU8, malloc, setU32, fixupPointer } from "./memory"; import { assertNoProxies } from "./gc-handles"; @@ -144,8 +144,10 @@ async function instantiateWasmWorker ( // Instantiate from the module posted from the main thread. // We can just use sync instantiation in the worker. const instance = new WebAssembly.Instance(Module.wasmModule!, imports); - successCallback(instance, undefined); Module.wasmModule = null; + + preRunWorker(); + successCallback(instance, undefined); } @@ -157,7 +159,6 @@ export function preRunWorker () { mono_log_debug("preRunWorker"); init_c_exports(); cwraps_internal(INTERNAL); - jiterpreter_allocate_tables(); // this will return quickly if already allocated runtimeHelpers.nativeExit = nativeExit; runtimeHelpers.nativeAbort = nativeAbort; runtimeHelpers.runtimeReady = true; @@ -345,7 +346,6 @@ export function postRunWorker () { // signal next stage runtimeHelpers.runtimeReady = false; - runtimeHelpers.afterPreRun = createPromiseController(); endMeasure(mark, MeasuredBlock.postRunWorker); } catch (err) { mono_log_error("postRunWorker() failed", err); @@ -473,7 +473,7 @@ export async function start_runtime () { monoThreadInfo.isAttached = true; monoThreadInfo.isRunning = true; monoThreadInfo.isRegistered = true; - runtimeHelpers.currentThreadTID = monoThreadInfo.pthreadId = runtimeHelpers.managedThreadTID = mono_wasm_pthread_ptr(); + runtimeHelpers.currentThreadTID = monoThreadInfo.pthreadId = runtimeHelpers.managedThreadTID = tcwraps.pthread_self(); update_thread_info(); runtimeHelpers.isManagedRunningOnCurrentThread = true; } diff --git a/src/mono/browser/runtime/types/internal.ts b/src/mono/browser/runtime/types/internal.ts index 5412d6292ec6ad..48f989867fbc81 100644 --- a/src/mono/browser/runtime/types/internal.ts +++ b/src/mono/browser/runtime/types/internal.ts @@ -436,7 +436,9 @@ export declare interface EmscriptenModuleInternal { mainScriptUrlOrBlob?: string; ENVIRONMENT_IS_PTHREAD?: boolean; FS: any; - wasmModule: WebAssembly.Instance | null; + wasmModule: WebAssembly.Module | null; + wasmMemory: WebAssembly.Memory | null; + handlers: any; wasmExports: any; getWasmTableEntry(index: number): any; removeRunDependency(id: string): void; @@ -536,6 +538,8 @@ export interface PThreadWorker extends Worker { // this info is updated via async messages from the worker, it could be stale info: PThreadInfo; thread?: Thread; + queue: MessageEvent[]; + handler: ((ev: MessageEvent) => void) | null; } export interface PThreadInfo { diff --git a/src/mono/browser/test-main.mjs b/src/mono/browser/test-main.mjs index 7db3721bb44eaf..b256d8bba5ab56 100644 --- a/src/mono/browser/test-main.mjs +++ b/src/mono/browser/test-main.mjs @@ -263,6 +263,7 @@ function configureRuntime(dotnet, runArgs) { dumpThreadsOnNonZeroExit: true, loadAllSatelliteResources: true, jsThreadBlockingMode: "ThrowWhenBlockingWait", + pthreadPoolInitialSize: 15, }); if (ENVIRONMENT_IS_NODE) { diff --git a/src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets b/src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets index ab8d6606aba35e..7e2a6bdb54f174 100644 --- a/src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets +++ b/src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets @@ -248,6 +248,9 @@ Copyright (c) .NET Foundation. All rights reserved. + + + diff --git a/src/mono/sample/wasm/browser-advanced/Wasm.Advanced.Sample.csproj b/src/mono/sample/wasm/browser-advanced/Wasm.Advanced.Sample.csproj index 815953ebc35a40..365a61629523a8 100644 --- a/src/mono/sample/wasm/browser-advanced/Wasm.Advanced.Sample.csproj +++ b/src/mono/sample/wasm/browser-advanced/Wasm.Advanced.Sample.csproj @@ -8,6 +8,8 @@ true true web,worker + false + <_WasmAllowAOTDebug>true -s USE_CLOSURE_COMPILER=1 -s LEGACY_GL_EMULATION=1 -lGL -lSDL -lidbfs.js diff --git a/src/mono/sample/wasm/browser-threads/Wasm.Browser.Threads.Sample.csproj b/src/mono/sample/wasm/browser-threads/Wasm.Browser.Threads.Sample.csproj index 95f97960be068c..1858d246b3dd50 100644 --- a/src/mono/sample/wasm/browser-threads/Wasm.Browser.Threads.Sample.csproj +++ b/src/mono/sample/wasm/browser-threads/Wasm.Browser.Threads.Sample.csproj @@ -1,6 +1,10 @@ true + true + false + false + false diff --git a/src/mono/sample/wasm/browser-threads/wwwroot/main.js b/src/mono/sample/wasm/browser-threads/wwwroot/main.js index 9befe7d600c693..5653a68c15a1cf 100644 --- a/src/mono/sample/wasm/browser-threads/wwwroot/main.js +++ b/src/mono/sample/wasm/browser-threads/wwwroot/main.js @@ -19,6 +19,7 @@ try { exitOnUnhandledError: true, logExitCode: true, jsThreadBlockingMode: "WarnWhenBlockingWait", + pthreadPoolInitialSize: 15, }) .create();