net: extend the host netdev to darwin - #74
Open
yohimik wants to merge 1 commit into
Open
Conversation
The host netdev was for linux only, so a macOS binary registered no netdev and every Dial reported "Netdev not set". Nothing in it is specific to linux. Darwin also keeps the standard library syscall package, where the TinyGo compiler routes the libc_*_trampoline symbols to libSystem, so the same raw-socket implementation works there. Widen the build constraint to (linux || darwin) and move the one part that is different, the socket options for every socket, into per-OS setSockDefaults functions. Linux keeps the same SO_REUSEADDR as before. Darwin adds SO_NOSIGPIPE, because a BSD socket raises SIGPIPE on a write to a closed connection and darwin has no MSG_NOSIGNAL to prevent it for one write. Accept now retries on EINTR, as Connect, Send and Recv already do. Under the threads scheduler a GC cycle interrupts a blocking call with a signal, and a server must not see that as a failed accept. An accepted socket gets the same defaults as a created one, which puts SO_NOSIGPIPE on the connections that a server writes to.
This was referenced Aug 30, 2026
Author
|
tinygo-org/net main has not moved since this branch was opened. It is still |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
net: extend the host netdev to darwin
Repository tinygo-org/net. Branch
upstream-pr/darwin-host-netdev, basemain.What this does
The host netdev was for linux only, so a macOS binary registered no netdev and
every
Dialreported "Netdev not set". Nothing in it is specific to linux.Darwin also keeps the standard library
syscallpackage, where the TinyGocompiler routes the
libc_*_trampolinesymbols to libSystem, so the sameraw-socket implementation works there.
netdev_native.gobecomes(linux || darwin).into per-OS
setSockDefaultsfunctions innetdev_native_linux.goandnetdev_native_darwin.go.SO_REUSEADDRas before. Darwin addsSO_NOSIGPIPE,because a BSD socket raises SIGPIPE on a write to a closed connection and
darwin has no
MSG_NOSIGNALto prevent it for one write. Without it a peerthat hangs up in the middle of a response kills the process instead of a
return of EPIPE from
Send.Acceptretries on EINTR, asConnect,SendandRecvalready do. Underthe threads scheduler a GC cycle interrupts a blocking call with a signal, and
a server must not see that as a failed accept.
SO_NOSIGPIPEon the connections that a server writes to.Evidence
There is no CI in this repository, so the checks were run by hand on macOS 26.6
arm64 with a TinyGo build that carries the matching toolchain change.
net.LookupHostandhttp.Get("https://example.com/")builds and completes with this branch and the three other branches in this
series.
A downstream product ships binaries built with these changes in a production
release. dispat v1.4.0 is published and is not a prerelease. It carries
dispat-tiny-linux-amd64anddispat-tiny-linux-arm64, built by the forkrelease v0.42.0-net.4 from sha256-pinned tarballs and smoke-executed under
binfmt before upload, beside six binaries from the gc toolchain.
https://github.com/yohimik/dispat/releases/tag/services%2Fdispat%2Fv1.4.0
The acceptance record of that repository is committed at
packages/docs/docs/internals/tinygo.md. It reports the net.2 to net.4acceptance history, an integration suite of 694 rows that passes with 0 failures
and 1 documented skip on darwin, and a size table of 0.58x to 0.63x against the
gc equivalents with TinyGo
-opt=z -no-debugagainstgo build -trimpath -ldflags "-s -w". Those figures come from that document. They are not ameasurement of this branch.
The rows of that suite include DNS, TCP, TLS and x509 paths. The shipped
binaries in that release are for linux. The darwin evidence is the acceptance
record and the check above.
Dependencies
the tinygo PR "builder: declare the BSD socket API in the darwin libSystem
stub". Without it a darwin program that opens a socket does not link.
Known gaps
SO_RCVTIMEOandSO_SNDTIMEO, and a call that EINTR restartsbegins its timeout again, so a deadline can be later than it should be under a
heavy GC load.
Related
Related pull requests
This change is part of one body of work. Together the changes make programs that use the network and child processes work on hosted linux and macOS. A full CLI was tested end to end with all of them and ships binaries built this way, see dispat v1.4.0 in the evidence section.
In tinygo-org/tinygo
In this repository
A merge order that works. The three bug fixes are independent. tinygo-org/tinygo#5633 goes before tinygo-org/tinygo#5635. HTTPS on linux needs only tinygo-org/tinygo#5633 and tinygo-org/tinygo#5635. Full darwin support also needs tinygo-org/tinygo#5636, the net changes and a new src/net submodule pin.