#32387 ipc: add windows support

ReviewabilityReviewsAgreementSize
#32387 ryanofsky ipc: add windows supportCI failing0Positive2,541 + 189 tests
  • Allow Bitcoin Core multiprocess mode and IPC features to build and run on Windows
  • Enable testing and deployment of separated process binaries on Windows platforms
  • CI is failing so check whether the failure is caused by this PR before a deep review
  • Concept approval without stated reasons (hebasto)
  • Suggested testing compatibility with clang-cl (Sjors)
  • 2,541 lines added or modified outside tests
  • 189 lines added or modified in tests
  • 880 lines removed in total
  • 102 files, 33 commits
Build and CI#21 of 56
P3 · platform fix
  • P3 because it updates Windows resource generation and build configurations for IPC
  • Replaces static resource files with a dynamic CMake generator across all targets
IPC / multiprocess#6 of 18
P2 · platform fix
  • P2 because it extends IPC and process separation coverage to Windows
  • Unblocks Windows testing and deployment for the broader multiprocess project
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:

ReviewerTypeHarm, request, or questionStatusMust beAuthor repliedQuote
Sjors (member)suggestion, approachCombine with #31756 and #30437 to make testing via Windows Guix builds easieranswered · ryanofsky agreed that #31756 makes testing easier and noted prerequisite PR prioritiesansweredyes2025-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, approachTry testing if this works with clang-clopenansweredno2026-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

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

dossier JSON · extract JSON · model ledger, generated 2026-10-22T01:13, confidence high, input hash 477f7e645bf57f35
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