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();