SerialPort and Named Pipes
February has been all about connecting low-level I/O pieces end to end.
A new cross-platform SerialPort library landed with dedicated tests (including com0com coverage), while named-pipe support now spans File, Async, and AsyncStreams.
The result is that local IPC and serial communication can now be handled with the same async building blocks used by the rest of the project, with better test coverage across platform-specific behavior.
Detailed list of commits:
- SerialPort: Add cross-platform library to handle serial ports
- SerialPort: Add com0com test
- File: Add named pipe server/client API and coverage
- Async: Add named pipe input/output tests
- AsyncStreams: Add PipeDescriptor stream init and named pipe tests
- Async: Add async serial port tests
- File: Use pipe2 to set CLOEXEC atomically for new pipes
Async Runtime
Async received several runtime reliability upgrades this month.
The new AsyncFileSend primitive is now part of the core, and multiple fixes improved cancellation safety and timer sequencing.
Backend wakeup/process handling was also strengthened with platform-native primitives (eventfd, EVFILT_USER, pidfd) so event loops can coordinate shared wakeups and process exits more predictably, especially on Linux.
Detailed list of commits:
- Async: Add AsyncFileSend primitive
- Async: Only reset Flag_NeedsTeardown if async is accessible
- Async: Keep sequenced LoopTimeouts in active timer list
- Async: Keep completion-state invariant during IOCP cancellation
- Async: Use eventfd on epoll and EVFILT_USER on kqueue for shared wakeups
- Async: Use pidfd for Linux epoll process exit handling
Http and AsyncWebServer
Http now uses AsyncFileSend for file server transfers, and header accumulation got a small optimization.
At the same time, AsyncWebServer and examples gained more runtime knobs: selecting ports, forcing epoll backend options, and configuring max clients / I/O threads.
These changes make it easier to benchmark and stress the server in real scenarios, while keeping setup fully self-hosted.
Detailed list of commits:
- Http: Use AsyncFileSend in file server
- Http: Header accumulation minor optimization
- AsyncWebServer: Expose max clients and io threads as CLI parameters
- Examples: Add options to force using epoll backend
- Examples: Add port argument to AsyncWebServer
Testing and Build
A good portion of the work focused on making test runs more parallel-friendly and less conflicting.
BuildTest and PluginTest fixtures are now isolated better, while SCTest supports configurable port offsets and opt-in BuildTest execution for local workflows.
This should reduce flakiness when multiple configurations or runs happen at the same time.
Detailed list of commits:
- Build: Isolate BuildTest outputs for parallel SCTest runs
- Testing: Make BuildTest opt-in locally via --all-tests
- Testing: Add configurable SCTest port offsets
- Plugin: Isolate PluginTest fixtures for parallel SCTest runs
Others
The rest of the month includes practical API and platform cleanups across multiple libraries.
From read error parsing in File, to ProcessEnvironment::get, to exposing SO_REUSEADDR, this batch improves day-to-day ergonomics while tightening edge-case behavior.
Detailed list of commits:
- File: Parse read errors in FileDescriptor::readAppend
- Process: Add ProcessEnvironment::get
- Socket: Expose SO_REUSEADDR
- FileSystemWatcher: Increment relative path storage
- Tools: Update 7zr to 26.00
See you next month!