#32387 ipc: add windows support
| Reviewability | Reviews | Agreement | Size | |||||||
|---|---|---|---|---|---|---|---|---|---|---|
| #32387 ipc: add windows support | CI failing | 0 | Positive | 2,541 + 189 tests | ||||||
|
|
|
|
| ||||||
Reviewability: ReadyStalePaused Agreement: StrongPositivePositive w/ caveatsNeutralMildDisputedBlockedCrickets Reviews: current code-review ACKs, then (+stale ACKs) and -NACKs; greener = more ACKs. Size: lines added or modified outside tests, then in tests; greener = smaller. | ||||||||||
Goal
This pull request adds Windows support for Bitcoin Core's IPC subsystem and updates the libmultiprocess subtree. It replaces POSIX-only process spawning and socket primitives with Windows equivalents (named pipes, WSADuplicateSocket, overlapped I/O, and `_spawnvp`/`_cwait` process tracking), consolidates Windows executable manifest and resource handling into a CMake helper, and enables IPC targets across MinGW, MSVC, and CI environments.
Problem: Bitcoin Core's IPC features and multiprocess mode cannot build or run on Windows because libmultiprocess and internal process-spawning helpers rely on POSIX APIs (such as `fork`, `execvp`, and Unix domain sockets), preventing Windows testing and deployment of multiprocess binaries.
Evidence of importance:
- Resolves libmultiprocess issues #53 and #114 according to the PR description
- Part of the broader process separation project (tracking issue #28722)
Scope: Contains a major `src/ipc/libmultiprocess` subtree update squashed alongside Core modifications, and temporarily disables the subtree linter check (`test/lint/test_runner/src/util.rs`). It also replaces all static Windows `.rc` resource files for executables with a dynamic CMake generator (`add_windows_exe_resources`).
Risk of a mistake: medium (build, tests, other). Modifies Windows process execution logic and replaces the manifest and resource generation mechanism for all Windows release binaries.
Changed since the previous assessment: Incorporated subsequent upstream libmultiprocess commits, added MSVC fixes (including `/bigobj` for `mptest` and compiler warning suppressions), updated vcpkg configurations for CI fuzz builds, and refined Windows socket and errno handling.
Reviewability
Ready · CI failing
CI is red; check whether the failure is the PR's before a deep review.
Waiting on (from the thread read):
- author: response or testing regarding clang-cl compatibility 2026-10-13
Agreement
Positive
support without stated reasons, no open objection (hebasto)
Thread notes: Processed author's rebase and update descriptions in c:5049420345. Claims and support remain unchanged.
Objections, suggestions, and questions:
| Reviewer | Type | Harm, request, or question | Status | Must be | Author replied | Quote |
|---|---|---|---|---|---|---|
| Sjors (member) | suggestion, approach | Combine with #31756 and #30437 to make testing via Windows Guix builds easier | answered · ryanofsky agreed that #31756 makes testing easier and noted prerequisite PR priorities | answered | yes | 2025-04-30: 'I guess the easiest way to test this would be to combine it with: 1. #31756 so I can bake a Widnows guix build instead of learning to compile on Windows; and 2. #30437 to have something to test agains' Status from: 2025-04-30: ryanofsky: 'Agree changes in #31756 should make this easier to test (though I might be able to make a minimal change here to turn on' |
| Sjors (member) | suggestion, approach | Try testing if this works with clang-cl | open | answered | no | 2026-10-13: 'Note: we should try if this works with clang-cl (cc @hebasto)' |
Support:
- hebasto (member) (Concept ACK, 2025-04-30): (no reason given) [not substantive]
Participants:
- Sjors (member, neutral, 2 statements 2025-04-30 to 2026-10-13): suggested combining with other PRs for testing and trying with clang-cl
- hebasto (member, support, 1 statements 2025-04-30 to 2025-04-30): Concept ACK
Dependencies
Depends on: #bitcoin-core/libmultiprocess#231, #bitcoin-core/libmultiprocess#317, #bitcoin-core/libmultiprocess#318
Enables:
- Process separation project on Windows (#28722)
Files
214 lines under test/bench/ci.
- src/ipc/libmultiprocess/src/mp/util.cpp +416/-37
- src/ipc/libmultiprocess/src/mp/proxy.cpp +170/-48
- src/ipc/libmultiprocess/test/mp/test/connect_tests.cpp +214/-0
- src/ipc/libmultiprocess/test/mp/test/test.cpp +208/-6
- src/ipc/libmultiprocess/include/mp/proxy-io.h +131/-46
- src/ipc/libmultiprocess/test/mp/test/socketlistener.h +157/-0
- src/ipc/libmultiprocess/test/mp/test/listen_tests.cpp +50/-80
- test/functional/test_framework/ipc_util.py +126/-1
- src/ipc/libmultiprocess/test/mp/test/util_tests.cpp +112/-0
- src/ipc/libmultiprocess/include/mp/util.h +95/-16
- src/ipc/libmultiprocess/shell.nix +93/-12
- src/ipc/libmultiprocess/src/mp/gen.cpp +48/-45
- src/ipc/libmultiprocess/ci/scripts/ci.sh +86/-1
- src/ipc/libmultiprocess/test/mp/test/spawn_tests.cpp +75/-10
- src/ipc/libmultiprocess/test/mp/test/foo.h +56/-1
- src/ipc/libmultiprocess/include/mp/proxy-types.h +40/-14
- src/ipc/util.h +0/-54
- src/ipc/libmultiprocess/include/mp/proxy.h +30/-23
- src/ipc/process.cpp +35/-9
- src/ipc/libmultiprocess/cmake/compat_config.cmake +0/-42
- src/qt/res/bitcoin-qt-res.rc +0/-40
- src/ipc/libmultiprocess/include/mp/type-number.h +24/-15
- src/CMakeLists.txt +11/-25
- src/ipc/libmultiprocess/CMakeLists.txt +25/-9
- src/bitcoin-cli-res.rc +0/-33
- src/bitcoin-res.rc +0/-33
- src/bitcoin-tx-res.rc +0/-33
- src/bitcoin-util-res.rc +0/-33
- src/bitcoin-wallet-res.rc +0/-33
- src/ipc/libmultiprocess/.github/workflows/ci.yml +19/-14
- test/functional/interface_ipc_cli.py +32/-1
- cmake/module/AddWindowsResources.cmake +32/-0
- src/ipc/libmultiprocess/test/mp/test/foo.capnp +28/-0
- src/ipc/libmultiprocess/include/mp/type-chrono.h +25/-2
- src/ipc/libmultiprocess/test/mp/test/common.h +27/-0
- src/ipc/libmultiprocess/include/mp/type-struct.h +12/-12
- src/ipc/interfaces.cpp +21/-1
- src/ipc/libmultiprocess/cmake/iwyu-wrapper.sh +22/-0
- src/ipc/libmultiprocess/ci/configs/windows.bash +21/-0
- src/ipc/libmultiprocess/include/mp/type-interface.h +10/-10
- src/ipc/libmultiprocess/include/mp/type-context.h +15/-3
- src/ipc/test/ipc_tests.cpp +17/-1
- CMakeLists.txt +15/-1
- src/ipc/libmultiprocess/.clang-tidy +12/-2
- src/ipc/capnp/protocol.cpp +10/-3
- src/ipc/libmultiprocess/.github/workflows/bitcoin-core-ci.yml +8/-5
- src/ipc/libmultiprocess/example/calculator.cpp +4/-9
- src/ipc/libmultiprocess/example/example.cpp +8/-5
- src/ipc/libmultiprocess/example/printer.cpp +4/-9
- test/functional/interface_gui.py +6/-7
- src/bitcoind-res.rc => cmake/windows-res.rc.in +6/-6
- src/ipc/libmultiprocess/include/mp/type-char.h +9/-3
- src/util/exec.cpp +11/-1
- test/functional/tool_bitcoin.py +0/-11
- src/ipc/libmultiprocess/ci/scripts/run.sh +6/-4
- src/ipc/libmultiprocess/doc/versions.md +8/-2
- src/ipc/libmultiprocess/include/mp/type-map.h +6/-4
- src/ipc/libmultiprocess/include/mp/type-unordered-set.h +5/-5
- src/ipc/libmultiprocess/ci/configs/netbsd.bash +1/-7
- src/ipc/libmultiprocess/cmake/pthread_checks.cmake +8/-0
- src/ipc/libmultiprocess/include/mp/type-set.h +4/-4
- src/ipc/libmultiprocess/include/mp/type-threadmap.h +4/-4
- src/ipc/libmultiprocess/include/mp/type-vector.h +4/-4
- test/functional/interface_ipc_mining.py +6/-2
- test/functional/test_framework/test_node.py +8/-0
- src/ipc/libmultiprocess/ci/configs/olddeps.bash +5/-2
- src/ipc/libmultiprocess/test/CMakeLists.txt +7/-0
- src/ipc/libmultiprocess/test/mp/test/foo-types.h +7/-0
- src/qt/CMakeLists.txt +4/-3
- vcpkg.json +7/-0
- .github/ci-windows.py +4/-2
- src/ipc/libmultiprocess/ci/configs/newdeps.bash +6/-0
- src/ipc/libmultiprocess/doc/design.md +3/-3
- src/ipc/libmultiprocess/doc/usage.md +6/-0
- src/bitcoin.cpp +4/-1
- src/ipc/libmultiprocess/include/mp/type-data.h +2/-3
- src/util/fs.h +5/-0
- src/ipc/libmultiprocess/ci/configs/sanitize.bash +2/-2
- src/ipc/libmultiprocess/ci/scripts/config.sh +2/-2
- src/ipc/libmultiprocess/include/mp/type-string.h +3/-1
- src/qt/test/CMakeLists.txt +3/-1
- test/functional/test_framework/test_framework.py +4/-0
- test/lint/test_runner/src/util.rs +3/-1
- depends/Makefile +1/-2
- src/ipc/process.h +0/-3
- .github/ci-windows-cross.py +1/-1
- src/ipc/libmultiprocess/ci/README.md +2/-0
- src/ipc/libmultiprocess/ci/configs/default.bash +1/-1
- src/ipc/libmultiprocess/ci/configs/freebsd.bash +1/-1
- src/ipc/libmultiprocess/ci/configs/gnu32.bash +1/-1
- src/ipc/libmultiprocess/ci/configs/llvm.bash +1/-1
- src/ipc/libmultiprocess/ci/configs/macos.bash +1/-1
- src/ipc/libmultiprocess/ci/configs/openbsd.bash +1/-1
- src/ipc/libmultiprocess/cmake/TargetCapnpSources.cmake +1/-1
- src/ipc/libmultiprocess/doc/install.md +1/-1
- src/ipc/libmultiprocess/include/mp/type-function.h +1/-1
- src/ipc/libmultiprocess/include/mp/version.h +1/-1
- ci/test/00_setup_env_win64.sh +0/-1
- depends/packages/capnp.mk +1/-0
- src/ipc/libmultiprocess/include/mp/config.h.in +1/-0
- src/ipc/test/fuzz/ipc.cpp +0/-1
- test/config.ini.in +1/-0
Card
The short text the ranking pass compares across PRs.
This pull request implements Windows support for Bitcoin Core's IPC subsystem and pulls in corresponding upstream libmultiprocess subtree updates. It replaces Unix-specific process spawning and socket communication with Windows named pipes, WSADuplicateSocket, and overlapped I/O, while fixing the Windows wrapper executable to properly await child processes. The changes also consolidate Windows PE resource generation across binaries into CMake and enable IPC test coverage on Windows. This work is a prerequisite for running multiprocess Bitcoin on Windows (#28722) and resolves libmultiprocess issues #53 and #114.
Data
thread read through 2026-10-13 (8 statements), head daa7ea7143
labels: IPC, CI failed · draft
Categories
Build and CI
P3 · platform fix
Replaces static Windows `.rc` resource files with a dynamic CMake generator across all targets and adjusts build/CI configurations for Windows IPC support.
Membership: Adds `cmake/module/AddWindowsResources.cmake`, rewrites Windows resource generation for all executables, and configures MinGW/MSVC build targets.
Factors: security/stability 0, bug 0, performance 0, user value 1, leverage 2
IPC / multiprocess
P2 · platform fix
Extends IPC platform coverage to Windows by replacing POSIX-specific primitives, directly addressing libmultiprocess issues #53 and #114 and unblocking Windows multiprocess execution (#28722).
Membership: label IPC, updates the libmultiprocess subtree, and implements Windows process management and socket primitives in src/ipc.
Factors: security/stability 0, bug 0, performance 0, user value 1, leverage 2