Centralize I/O error handling and make read/write functions portable#15305
Merged
Ericson2314 merged 1 commit intoNixOS:masterfrom Feb 20, 2026
Merged
Centralize I/O error handling and make read/write functions portable#15305Ericson2314 merged 1 commit intoNixOS:masterfrom
Ericson2314 merged 1 commit intoNixOS:masterfrom
Conversation
5cd8ec1 to
06bbc86
Compare
read and readOffset wrappers97c6510 to
7588701
Compare
Ericson2314
approved these changes
Feb 20, 2026
- Improve existing `read` and `readOffset` wrappers: - Unix: Add `EINTR` retry handling and `checkInterrupt` - Windows: Handle `ERROR_BROKEN_PIPE` as EOF, add `checkInterrupt` - Add `write` wrapper with same treatment (`EINTR` on Unix, `checkInterrupt`) - Improve many `windows/file-descriptor.cc` error messages with `descriptorToPath` - Move `readFull`, `readLine`, `writeFull` to common file, using the platform wrappers instead of duplicating platform-specific logic. These ones don't need any `EINTR` or interrupt checking either. They only have `EGAIN` checking as Unix-specific code, but this is a temp hack to be removed per NixOS#12688, so its fine that it goes in the platform-agnostic file for now. - Add `retryOnBlock` helper to abstract `EAGAIN`/`EWOULDBLOCK` poll-and-retry logic (Unix only, needed for buildhook workaround NixOS#12688) - Simplify `FdSource::readUnbuffered` to just call `nix::read` - Remove now-dead `EINTR` handling from `drainFD` and `copyFdRange` - `writeErr` better impl on Windows
7588701 to
c0e849b
Compare
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.
Motivation
Improve existing
readandreadOffsetwrappers:EINTRretry handling andcheckInterruptERROR_BROKEN_PIPEas EOF, addcheckInterruptAdd
writewrapper with same treatment (EINTRon Unix,checkInterrupt)Improve many
windows/file-descriptor.ccerror messages withdescriptorToPathMove
readFull,readLine,writeFullto common file, using the platform wrappers instead of duplicating platform-specific logic. These ones don't need anyEINTRor interrupt checking either. They only haveEGAINchecking as Unix-specific code, but this is a temp hack to be removed per Removepollfdworkaround #12688, so its fine that it goes in the platform-agnostic file for now.Add
retryOnBlockhelper to abstractEAGAIN/EWOULDBLOCKpoll-and-retry logic (Unix only, needed for buildhook workaround Removepollfdworkaround #12688)Simplify
FdSource::readUnbufferedto just callnix::readRemove now-dead
EINTRhandling fromdrainFDandcopyFdRangewriteErrbetter impl on WindowsAdd 👍 to pull requests you find important.
The Nix maintainer team uses a GitHub project board to schedule and track reviews.