๐ Sane C++ October 26
Welcome to the October 2026 update! This month: C++ Day, an AsyncExecution experiment that helped strengthen Async, shorter CI jobs, and more Fil-C coverage.
C++ Day 2026
On October 17 I presented Old-School C++ for the Agentic Age: Lessons from Sane C++ Libraries at C++ Day 2026 in Pavia. The talk covers cross-platform APIs, explicit ownership and lifetimes, fast verification loops, and my experience developing with coding agents.
The slides, including demos and bonus material about AsyncExecution, are available in English and Italian.
AsyncExecution experiment
This month I added AsyncExecution, an experimental sender/receiver layer built on Async. It explores C++26 sender algorithms for composing timers, files, sockets, worker tasks, and cancellation using the same event loop as Await and AsyncFibers.
Ownership stays explicit: payloads live in caller-owned storage, and a scope can use a bounded set of typed slots for operations. Requesting cancellation or reaching a timeout does not make borrowed buffers safe to reuse until the outstanding work has completed its handoff.
The code and examples
remain experimental and may change or disappear. CI tests the optional stdexec provider on macOS, Linux, and Windows;
this is an interoperability check, not a claim of native std::execution conformance.
Most of this month's Async strengthening came from edge cases discovered while developing AsyncExecution. Even if the adapter stays experimental, building it has already been useful for the underlying library.
AsyncExecution commit ยท CI coverage
Strengthening Async
Composing operations exposed difficult cases around partial transfers, cancellation, and callback lifetimes. The resulting fixes make sure completions are delivered once, preserve observed progress, and finish bookkeeping before a callback can destroy or reuse its request.
Windows vector writes now track completed bytes and avoid duplicate IOCP completions. File sends preserve progress at EOF. Cancellation joins the completion path, wake-up callback storage survives delivery, and POSIX connect watchers are removed before stopped completion. Datagram truncation is reported consistently, and io_uring initialization no longer risks closing stdin.
These changes benefit users of Async itself, along with its coroutine and fiber adapters.
Windows vector writes ยท Cancellation ยท Callback lifetime ยท Datagram truncation
Reducing CI time
The work since October 26 has focused on shorter feedback cycles. Windows runs core, auxiliary, and build-fixture jobs in parallel and reuses compatible MSVC setup. POSIX runs isolated test groups after one build; macOS auxiliary work also runs alongside the core builds. Fil-C reuses validated objects across test executables, and compiler and test timing diagnostics help identify the remaining expensive work.
A unity-build option was tried and then reverted because hosted measurements did not show a consistent benefit.
For one comparison, I measured successful development pushes on October 25 (32784c491) and October 31
(74ae1b413). These are individual job durations, from job start to completion, excluding queue and prerequisite
waits:
| Measurement | October 25 | October 31 | Change |
|---|---|---|---|
| Longest Windows job | 9m 02s | 3m 42s | 59% shorter |
| Longest POSIX job, including Fil-C | 5m 39s | 3m 22s | 40% shorter |
| Summed job time across both workflows | 53m 41s | 52m 34s | 2% lower |
The shorter jobs show the effect of dividing work; they are not the total pipeline wait, which also includes prerequisites and queueing. Summed job time includes setup and warmup jobs and is not a billing estimate. These are single runs, not averages, and caches and runner load vary. Documentation/coverage and the separate package-cache workflow are excluded.
Source runs: October 25 Windows, October 25 POSIX, October 31 Windows, and October 31 POSIX.
POSIX test groups ยท Fil-C object reuse ยท macOS auxiliary jobs ยท Unity revert
Fil-C and Fibers
Fil-C coverage now includes HttpClient TLS and HTTP/2 transfers, Cryptography's Linux AF_ALG and OpenSSL paths, and restored process and serial-port tests on native ARM.
Fibers gained opt-in Fil-C scheduling and AsyncFibers integration. That mode uses runtime-owned stacks and stays on the owning thread; worker pools, stealing, and cross-thread execution are rejected. Native Fibers also gained GCC ARM64 context switching, sanitizer fixes, and scheduler wake-up and quiescence fixes. Plugin can use matching Fil-C toolchains with explicit reload limits.
Fil-C fibers ยท GCC ARM64 ยท Fil-C HTTP/2 and TLS
Test reliability and other fixes
Several flaky tests now synchronize explicitly: the WebSocket release test waits for connection, AsyncFibers tests publish suspension before polling, and fiber auto-reset tests acknowledge each signal. Support-tool tests use separate scratch directories, while timeouts provide better diagnostics.
Some failures exposed library bugs. FileSystemWatcher now drains pending Apple notification handoffs before refreshing watches. Http received keep-alive, close-policy, incremental-header, and callback-lifetime fixes. HttpClient rejects truncated Windows responses and preserves body-stream errors. There were also fixes in Strings, Time, and Plugin.
Finally, the new simplification skill helps review repeated code and test setup while keeping behavioral coverage visible.
FileSystemWatcher fix ยท Http keep-alive ยท HttpClient errors ยท WebSocket test
See you next month!
