Skip to content

[browser] native - no process, no signals, no threads, no blocking#123962

Merged
pavelsavara merged 2 commits intodotnet:mainfrom
pavelsavara:browser_no_sockets
Feb 13, 2026
Merged

[browser] native - no process, no signals, no threads, no blocking#123962
pavelsavara merged 2 commits intodotnet:mainfrom
pavelsavara:browser_no_sockets

Conversation

@pavelsavara
Copy link
Member

@pavelsavara pavelsavara commented Feb 3, 2026

Contributes to #122506

@pavelsavara pavelsavara added this to the 11.0.0 milestone Feb 3, 2026
@pavelsavara pavelsavara self-assigned this Feb 3, 2026
@pavelsavara pavelsavara added arch-wasm WebAssembly architecture area-System.Net.Sockets os-browser Browser variant of arch-wasm labels Feb 3, 2026
Copilot AI review requested due to automatic review settings February 3, 2026 20:38
@dotnet-policy-service
Copy link
Contributor

Tagging subscribers to this area: @karelz, @dotnet/ncl
See info in area-owners.md if you want to be subscribed.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request adds support for the browser (WASM) target by providing stub implementations for features not available in the browser environment, specifically: no sockets, no threads, and no blocking operations.

Changes:

  • Added browser-specific stub implementations for networking, interface addresses, network statistics, and console APIs
  • Updated error messages in WASM-specific files from "WASI" to "WASM" for clarity
  • Modified CoreCLR PAL to prevent blocking operations and thread suspension in single-threaded WASM
  • Updated build configuration to disable socket support for browser targets and include browser-specific source files
  • Added perftracing configuration for browser builds

Reviewed changes

Copilot reviewed 20 out of 21 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
src/native/libs/System.Native/pal_signal_wasm.c Updated error messages from "WASI" to "WASM"
src/native/libs/System.Native/pal_networkstatistics_wasm.c New file with stub implementations returning "not supported" for network statistics APIs
src/native/libs/System.Native/pal_networking_browser.c New file with comprehensive stub implementations for all networking APIs, returning ENOTSUP
src/native/libs/System.Native/pal_io.c Added early return for pipe() on WASM targets with ENOTSUP
src/native/libs/System.Native/pal_interfaceaddresses_browser.c New file with stub implementations for interface enumeration APIs
src/native/libs/System.Native/pal_dynamicload_wasm.c Updated error messages from "WASI" to "WASM"
src/native/libs/System.Native/pal_console_wasm.c New console implementation for WASM with some working features (stdin/isatty) and stubs for unsupported features
src/native/libs/System.Native/CMakeLists.txt Updated build configuration to differentiate between browser and WASI targets, using browser-specific source files
src/native/eventpipe/ds-ipc-pal-websocket.c Added string duplication helper functions for eventpipe
src/mono/mono/profiler/log.c Changed sys/socket.h include guard from HOST_WIN32 to HAVE_SYS_SOCKET_H
src/mono/mono/profiler/helper.c Changed sys/socket.h include guard from HOST_WIN32 to HAVE_SYS_SOCKET_H
src/mono/mono/profiler/CMakeLists.txt Disabled AOT profiler for browser targets
src/mono/mono/mini/cfgdump.c Added guard for sys/socket.h include
src/mono/browser/runtime/dotnet.d.ts Formatting fix: removed space before parentheses in function signatures
src/coreclr/pal/src/thread/threadsusp.cpp Added guard to prevent thread suspension in single-threaded WASM
src/coreclr/pal/src/thread/thread.cpp Added guard to prevent CREATE_SUSPENDED flag in single-threaded WASM
src/coreclr/pal/src/synchmgr/wait.cpp Added guards to prevent blocking waits and made Sleep return immediately in WASM
src/coreclr/pal/src/synchmgr/synchmanager.cpp Added assertion to prevent waiting on non-signaled objects in WASM
src/coreclr/pal/src/debug/debug.cpp Added WASM-specific implementation of PAL_ProbeMemory using emscripten heap size
eng/native/tryrun.browser.cmake Disabled HAVE_SYS_SOCKET_H for browser targets
eng/native.wasm.targets Added perftracing configuration flags for browser builds

@pavelsavara
Copy link
Member Author

Whole this PR makes emscripten emulator smaller only by 20KB of JavaScript - from 154KB to 134KB.
And only 4KB of .wasm with -O3. Those are CoreCLR numbers, it will have similar impact for Mono but I have not measured it yet.

I hoped for more, I'm not sure I want to merge this...

@pavelsavara
Copy link
Member Author

These are JS emulators of mmap that are slow and terrible, we should not use them in CoreCLR

adding _mmap_js (referenced by root reference (e.g. compiled C/C++ code))
adding _msync_js (referenced by root reference (e.g. compiled C/C++ code))
adding _munmap_js (referenced by root reference (e.g. compiled C/C++ code))

The rest of the JS support is OK. See https://gist.github.com/pavelsavara/f11dd1078548a16fc923de444f1c9d9b

All the symbols in the wasm files are https://gist.github.com/pavelsavara/b7653066a83554168739558630d34847

Among them these caught my eye

GetNativeSwiftPhysicalLowering

GetThreadStaticsByIndex
SwitchStackAndExecuteHandler
Thread::HandleThreadAbort
ThreadNative_Abort
ThreadNative_ResetAbort
ThreadNative_Start
ThreadSuspend::LockThreadStore

WKS::gc_heap and SVR::gc_heap

COMDouble
COMSingle
COMDelegate
OleVariant
RealCOMPlusThrow

@jkotas
Copy link
Member

jkotas commented Feb 4, 2026

These are JS emulators of mmap that are slow and terrible, we should not use them in CoreCLR

#117813 is the main offender.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 26 out of 27 changed files in this pull request and generated 7 comments.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 26 changed files in this pull request and generated 4 comments.

Copilot AI review requested due to automatic review settings February 6, 2026 12:27
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 27 out of 28 changed files in this pull request and generated 6 comments.

Copilot AI review requested due to automatic review settings February 6, 2026 14:02
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 24 out of 25 changed files in this pull request and generated 5 comments.

Copilot AI review requested due to automatic review settings February 11, 2026 18:52
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Copilot AI review requested due to automatic review settings February 12, 2026 14:12
@pavelsavara pavelsavara changed the title [browser] native - no sockets, no threads, no blocking [browser] native - no process, no signals, no threads, no blocking Feb 12, 2026
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 15 out of 16 changed files in this pull request and generated 2 comments.

pavelsavara added a commit to pavelsavara/runtime that referenced this pull request Feb 12, 2026
@pavelsavara pavelsavara requested a review from jkotas February 12, 2026 21:31
@jkotas jkotas requested a review from radekdoulik February 13, 2026 04:10
Copilot AI review requested due to automatic review settings February 13, 2026 07:43
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 14 out of 15 changed files in this pull request and generated 3 comments.

Copy link
Member

@noahfalk noahfalk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I hoped for more, I'm not sure I want to merge this...

Is there anything you were particularly concerned about? Most of the changes looked like we are just making it clearer what is supported. Those aspects seemed benign and help raise visibility about the platform constraints even if they had no size benefits.

I didn't review everything, but to the degree this intersected the diagnostics stuff it seemed fine to me.

@pavelsavara
Copy link
Member Author

pavelsavara commented Feb 13, 2026

I hoped for more, I'm not sure I want to merge this...

I hoped that there will be larger reduction in size of the native binary. And I was not sure about the added code complexity.

The 20KB of JavaScript is good win (with the sockets part I split to separate PR), because that file is on critical path during startup.

@pavelsavara
Copy link
Member Author

/ba-g failed CI is infra

@pavelsavara pavelsavara merged commit fdaebbf into dotnet:main Feb 13, 2026
166 of 169 checks passed
@pavelsavara pavelsavara deleted the browser_no_sockets branch February 13, 2026 15:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

arch-wasm WebAssembly architecture area-PAL-coreclr os-browser Browser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants