feat: S11.09 AtomicCounter family + TLS + FatFs onto PoolAllocator#415
Conversation
Pool-exhaustion fallback for both AtomicCounter backends (StdAtomicCounter and WindowsAtomicCounter). Wired under the existing HAVE_ATOMIC_COUNTER gate alongside the public vtable dispatcher. Increment returns 1U unconditionally — RFC 5424 §7.3.1 requires sequenceIds in [1, 2^31 - 1] and never 0, so 1U is indistinguishable from the post-power-on / post-wrap state and is the safest fallback when an integrator's pool is exhausted. The Null itself is silent; the error is emitted from *Static.c::Create at the bad-setup point per the existing pool-exhaustion contract. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Splits StdAtomicCounter and WindowsAtomicCounter onto the canonical
3-TU pattern (Class.c + ClassPrivate.h + ClassStatic.c) using
SolidSyslogPoolAllocator, and deletes the public storage typedefs +
SOLIDSYSLOG_*_SIZE enums. Pool-exhaustion and use-after-destroy
both fall back to the shared SolidSyslogNullAtomicCounter from the
prior commit; SolidSyslog_Error fires once at Create-time per the
existing bad-setup contract.
Combined into one commit because both backends share the
TestAtomicCounter_* shim in Tests/SolidSyslogAtomicCounterTestHelper.h
— splitting per backend would leave the inactive platform's build
broken between commits.
Adds:
- SOLIDSYSLOG_{STD,WINDOWS}_ATOMIC_COUNTER_POOL_SIZE (default 1U)
- SOLIDSYSLOG_ERROR_MSG_{STD,WINDOWS}ATOMICCOUNTER_{POOL_EXHAUSTED,UNKNOWN_DESTROY}
- TestAtomicCounter_PoolSize() in the shared helper interface so the
backend-agnostic contract test can runtime-gate the two-counter
independence scenario
- Per-backend Pool TEST_GROUP (9 tests each, mirrors WindowsMutexPool)
- Tunable bumps in SmallMessageSizeTunables.h so
tunable-override-debug exercises the two-counter contract test
Caller updates: drops counterStorage locals in Bdd/Targets/Linux,
Bdd/Targets/Windows, Bdd/Targets/FreeRtos, Tests/SolidSyslogTest.cpp
and Tests/SolidSyslogMetaSdTest.cpp.
Trims an unused include in SolidSyslogNullAtomicCounter.c spotted
by IWYU once the first consumer landed.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Splits FatFsFile onto the canonical 3-TU pattern (Class.c +
ClassPrivate.h + ClassStatic.c) using SolidSyslogPoolAllocator, and
deletes the public SolidSyslogFatFsFileStorage typedef + the
SOLIDSYSLOG_FATFS_FILE_SIZE enum from the public header. Sizing now
lives entirely behind the INTERFACE library — integrators no longer
need to allocate or reason about the 180-intptr FIL+sector-buffer
blob. The planned S21.03 follow-up that was going to make FF_MAX_SS
> 512 overridable becomes simpler: it becomes a pool-internal
concern, not a public-API one.
Pool-exhaustion falls back to the shared SolidSyslogNullFile;
use-after-destroy is a safe no-op via Cleanup overwriting the base
vtable. SolidSyslog_Error fires once at Create-time per the existing
bad-setup contract.
Adds:
- SOLIDSYSLOG_FATFS_FILE_POOL_SIZE (default 1U)
- SOLIDSYSLOG_ERROR_MSG_FATFSFILE_{POOL_EXHAUSTED,UNKNOWN_DESTROY}
- 9-test Pool TEST_GROUP mirroring WindowsMutexPool
- ErrorHandlerFake + ConfigLockFake link deps for the FatFs test exe
INTERFACE library shape preserved — Platform/FatFs/CMakeLists.txt
still declares headers only; SolidSyslogFatFsFileStatic.c joins
SolidSyslogFatFsFile.c in every consumer's source list (FreeRtos
BDD target + Tests/FatFs).
Caller updates: drops storeFileStorage local in
Bdd/Targets/FreeRtos/main.c and the test storage in
SolidSyslogFatFsFileTest's TEST_GROUP fixture.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Splits TlsStream onto the canonical 3-TU pattern (Class.c +
ClassPrivate.h + ClassStatic.c) using SolidSyslogPoolAllocator, and
deletes the public SolidSyslogTlsStreamStorage typedef + the
SOLIDSYSLOG_TLS_STREAM_SIZE enum from the public header. Create
keeps its config argument; the storage arg goes away.
Pool-exhaustion falls back to the shared SolidSyslogNullStream;
use-after-destroy is a safe no-op via Cleanup overwriting the base
vtable. SolidSyslog_Error fires once at Create-time per the existing
bad-setup contract.
TlsStream-specific semantics preserved verbatim: bounded handshake
retry via the injected Sleep callback, mTLS all-or-nothing client-
identity contract, BIO_METHOD lifecycle (created on Open, freed on
Close + Destroy), SSL_read fail-fast on non-WANT_READ errors,
idempotent Close.
Adds:
- SOLIDSYSLOG_TLS_STREAM_POOL_SIZE (default 1U)
- SOLIDSYSLOG_ERROR_MSG_TLSSTREAM_{POOL_EXHAUSTED,UNKNOWN_DESTROY}
- 9-test Pool TEST_GROUP mirroring WindowsMutexPool
Removes:
- The CreateReturnsHandleInsideCallerSuppliedStorage test (asserted
the obsolete storage-cast invariant)
Caller updates: drops tlsStreamStorage locals in
Bdd/Targets/Common/BddTargetTlsSender_OpenSsl_{Posix,Winsock}Tcp.c
and Tests/OpenSslIntegration/SolidSyslogTlsStreamIntegrationTest.cpp.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (5)
✅ Files skipped from review due to trivial changes (1)
📝 WalkthroughWalkthroughThis PR migrates StdAtomicCounter, WindowsAtomicCounter, TlsStream, and FatFsFile to pool-backed Create/Destroy APIs, adds a NullAtomicCounter fallback, introduces pool-size tunables and error messages, updates CMake/build wiring, and updates tests and all callers to the new allocation model. ChangesPool Allocator Migration for Four Components
🎯 4 (Complex) | ⏱️ ~75 minutes Possibly related issues
Possibly related PRs
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
|
☀️ Quality Summary 🚦 build-linux-gcc: 100% successful (✔️ 1282 passed, 🙈 2 skipped) Created by Quality Monitor v1.14.0 (#f3859fd). More details are shown in the GitHub Checks Result. |
There was a problem hiding this comment.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
CLAUDE.md (1)
341-393:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winReconcile allocation-model guidance in this document.
These rows now document pool-backed
*_Create(void)correctly, but the later Storage injection section still presents caller-provided storage as the general rule. Please scope that section to classes that still use storage injection (or rewrite it as mixed-model migration guidance) to avoid contradictory contributor instructions.📝 Suggested doc adjustment
-**Storage injection:** - -- Mirrors the `SolidSyslogFormatterStorage` pattern. The public header exposes an opaque storage - type and a `SOLIDSYSLOG_<TYPE>_STORAGE_SIZE` macro; `_Create` takes a pointer to caller-allocated - storage of that size. No `malloc` anywhere in the library. +**Allocation model (during migration):** + +- The codebase currently uses two patterns: + - Storage-injection classes: public header exposes opaque storage and + `SOLIDSYSLOG_<TYPE>_STORAGE_SIZE`; `_Create` takes caller-provided storage. + - Pool-backed classes: `_Create(void)` allocates from fixed internal pools. +- No `malloc` anywhere in the library.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@CLAUDE.md` around lines 341 - 393, The Storage injection section contradicts the per-type pool-backed Create model documented for many headers (e.g., SolidSyslogTlsStream_Create, SolidSyslogSwitchingSender_Create, SolidSyslogPassthroughBuffer_Create, SolidSyslogPosixMutex_Create, SolidSyslogBlockStore_Create, SolidSyslogStdAtomicCounter_Create, etc.); update that section to either (a) scope the “caller-provided storage” guidance only to the few types that still require injected storage, listing those types explicitly, or (b) replace it with a short “mixed-model migration” note explaining that most current Create APIs use internal static pools and describing how contributors should choose between pool-backed Create APIs and the legacy storage-injection pattern when adding new types. Ensure the text references the Create/_Destroy naming convention and the pool-exhaustion fallback behavior so readers can reconcile both models.Tests/SolidSyslogTest.cpp (1)
632-749:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winMove pool-backed MetaSd resources to teardown-managed fixture state.
These tests create/destroy pool-backed handles inside the test body. If an assertion fails before cleanup, the pool slot can leak and cascade into unrelated failures later in the run. Please track these handles in fixture members and release them in
teardown().Based on learnings: In this codebase’s global-slot CppUTest test groups, use teardown()-only cleanup for per-test isolation.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Tests/SolidSyslogTest.cpp` around lines 632 - 749, Tests currently create pool-backed handles (e.g., via TestAtomicCounter_Create and SolidSyslogMetaSd_Create) inside test bodies and destroy them there, which can leak pool slots on assertion failure; instead, store created handles as fixture members (e.g., AtomicCounter* counter_; SolidSyslogStructuredData* metaSd_; SolidSyslogStructuredData* timeQuality_;) and assign them in each test, remove per-test SolidSyslog_Destroy/SolidSyslog_Create calls from teardown responsibility, and ensure teardown() always calls SolidSyslogMetaSd_Destroy(metaSd_), SolidSyslogTimeQualitySd_Destroy(timeQuality_) and TestAtomicCounter_Destroy(counter_) (and resets config.Sd/config.SdCount) so pool-backed resources are released even when assertions fail; update tests to only set fixture members and let teardown() perform the cleanup.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@DEVLOG.md`:
- Around line 163-183: Update the mismatched CI count: change the header
sentence "Two CI-gated checks remain" to reflect the four listed checks (or
alternatively reduce the list to two items); specifically make the sentence
consistent with the enumerated checks build-windows-msvc, bdd-windows-otel,
analyze-iwyu, and bdd-freertos-qemu so the document header and the list match.
In `@Platform/OpenSsl/Source/SolidSyslogTlsStream.c`:
- Around line 68-76: TlsStream_Cleanup currently releases TLS objects then
overwrites the base without closing the transport; modify TlsStream_Cleanup to
first close the transport (call TlsStream_Close(self) or directly invoke
SolidSyslogStream_Close(self->Config.Transport)) before calling
TlsStream_ReleaseHandshakeState and TlsStream_ReleaseSslContext, and only after
those releases overwrite *base with the SolidSyslogNullStream_Get() vtable so
the underlying transport is guaranteed closed during destroy.
In `@Tests/SolidSyslogNullAtomicCounterTest.cpp`:
- Around line 10-14: Add an explicit assertion that the accessor returns a
non-null handle: in the TEST_GROUP setup where
SolidSyslogNullAtomicCounter_Get() is called (the setup method assigning
counter), call the accessor and assert the returned pointer/handle is not null
before storing it (referencing SolidSyslogNullAtomicCounter_Get and the setup
method / counter variable) so the API contract is enforced; similarly add the
same non-null assertion in the other test group(s) covering lines 19-28 to
ensure both groups validate the accessor directly.
---
Outside diff comments:
In `@CLAUDE.md`:
- Around line 341-393: The Storage injection section contradicts the per-type
pool-backed Create model documented for many headers (e.g.,
SolidSyslogTlsStream_Create, SolidSyslogSwitchingSender_Create,
SolidSyslogPassthroughBuffer_Create, SolidSyslogPosixMutex_Create,
SolidSyslogBlockStore_Create, SolidSyslogStdAtomicCounter_Create, etc.); update
that section to either (a) scope the “caller-provided storage” guidance only to
the few types that still require injected storage, listing those types
explicitly, or (b) replace it with a short “mixed-model migration” note
explaining that most current Create APIs use internal static pools and
describing how contributors should choose between pool-backed Create APIs and
the legacy storage-injection pattern when adding new types. Ensure the text
references the Create/_Destroy naming convention and the pool-exhaustion
fallback behavior so readers can reconcile both models.
In `@Tests/SolidSyslogTest.cpp`:
- Around line 632-749: Tests currently create pool-backed handles (e.g., via
TestAtomicCounter_Create and SolidSyslogMetaSd_Create) inside test bodies and
destroy them there, which can leak pool slots on assertion failure; instead,
store created handles as fixture members (e.g., AtomicCounter* counter_;
SolidSyslogStructuredData* metaSd_; SolidSyslogStructuredData* timeQuality_;)
and assign them in each test, remove per-test
SolidSyslog_Destroy/SolidSyslog_Create calls from teardown responsibility, and
ensure teardown() always calls SolidSyslogMetaSd_Destroy(metaSd_),
SolidSyslogTimeQualitySd_Destroy(timeQuality_) and
TestAtomicCounter_Destroy(counter_) (and resets config.Sd/config.SdCount) so
pool-backed resources are released even when assertions fail; update tests to
only set fixture members and let teardown() perform the cleanup.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: e302c6a0-f652-4cca-88db-0aeddc4deeeb
📒 Files selected for processing (49)
Bdd/Targets/Common/BddTargetTlsSender_OpenSsl_PosixTcp.cBdd/Targets/Common/BddTargetTlsSender_OpenSsl_WinsockTcp.cBdd/Targets/FreeRtos/CMakeLists.txtBdd/Targets/FreeRtos/main.cBdd/Targets/Linux/main.cBdd/Targets/Windows/BddTargetWindows.cCLAUDE.mdCore/Interface/SolidSyslogNullAtomicCounter.hCore/Interface/SolidSyslogTunablesDefaults.hCore/Source/CMakeLists.txtCore/Source/SolidSyslogErrorMessages.hCore/Source/SolidSyslogNullAtomicCounter.cDEVLOG.mdPlatform/Atomics/CMakeLists.txtPlatform/Atomics/Interface/SolidSyslogStdAtomicCounter.hPlatform/Atomics/Source/SolidSyslogStdAtomicCounter.cPlatform/Atomics/Source/SolidSyslogStdAtomicCounterPrivate.hPlatform/Atomics/Source/SolidSyslogStdAtomicCounterStatic.cPlatform/FatFs/Interface/SolidSyslogFatFsFile.hPlatform/FatFs/Source/SolidSyslogFatFsFile.cPlatform/FatFs/Source/SolidSyslogFatFsFilePrivate.hPlatform/FatFs/Source/SolidSyslogFatFsFileStatic.cPlatform/OpenSsl/CMakeLists.txtPlatform/OpenSsl/Interface/SolidSyslogTlsStream.hPlatform/OpenSsl/Source/SolidSyslogTlsStream.cPlatform/OpenSsl/Source/SolidSyslogTlsStreamPrivate.hPlatform/OpenSsl/Source/SolidSyslogTlsStreamStatic.cPlatform/Windows/CMakeLists.txtPlatform/Windows/Interface/SolidSyslogWindowsAtomicCounter.hPlatform/Windows/Source/SolidSyslogWindowsAtomicCounter.cPlatform/Windows/Source/SolidSyslogWindowsAtomicCounterPrivate.hPlatform/Windows/Source/SolidSyslogWindowsAtomicCounterStatic.cTests/CMakeLists.txtTests/FatFs/CMakeLists.txtTests/FatFs/SolidSyslogFatFsFilePoolTest.cppTests/FatFs/SolidSyslogFatFsFileTest.cppTests/Fixtures/SmallMessageSizeTunables.hTests/OpenSslIntegration/SolidSyslogTlsStreamIntegrationTest.cppTests/SolidSyslogAtomicCounterContractTest.cppTests/SolidSyslogAtomicCounterTestHelper.hTests/SolidSyslogMetaSdTest.cppTests/SolidSyslogNullAtomicCounterTest.cppTests/SolidSyslogStdAtomicCounterPoolTest.cppTests/SolidSyslogStdAtomicCounterTestHelper.cTests/SolidSyslogTest.cppTests/SolidSyslogTlsStreamPoolTest.cppTests/SolidSyslogTlsStreamTest.cppTests/SolidSyslogWindowsAtomicCounterPoolTest.cppTests/SolidSyslogWindowsAtomicCounterTestHelper.c
CI analyze-format caught NamespaceIndentation drift. The local pre-commit format check only saw files with staged changes, so the new TEST_SOURCES entry slipped through the gcc-container test run. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
CodeRabbit feedback: the header sentence said "Two CI-gated checks remain" but the enumerated list has four (build-windows-msvc, bdd-windows-otel, analyze-iwyu, bdd-freertos-qemu). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
CodeRabbit feedback on PR #415. Pre-existing behavior (preserved verbatim by the S11.09 refactor): SolidSyslogTlsStream_Destroy released SSL/BIO state but did not close the underlying transport. A consumer who destroys a still-Open TlsStream leaks the transport (socket / fd). Cleanup now calls TlsStream_Close first, which: - runs SSL_shutdown + ReleaseHandshakeState if Ssl != NULL (otherwise no-op), and - always calls SolidSyslogStream_Close on the transport. Close is idempotent on every Stream impl, so the normal Open → Close → Destroy lifecycle is unaffected — the explicit Close clears Ssl, and Cleanup's implicit Close then sees Ssl == NULL and only re-closes the (already-closed, idempotent) transport. Pinned by the new test SolidSyslogTlsStream::DestroyClosesTransportWhenStillOpen. All 116 existing TlsStream unit tests + 9 OpenSSL integration tests still pass; tidy / cppcheck / clang-format / IWYU clean. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
CodeRabbit feedback on PR #415. Four SolidSyslog tests (MetaSdProducesSequenceIdInStructuredData, MetaSdSequenceIdIncrementsAcrossLogCalls, MsgFieldPreservedWithMetaSd, MetaSdAndTimeQualitySdCoexistInSdArray) acquired pool-backed handles (TestAtomicCounter, MetaSd, TimeQualitySd) as locals inside the test body and Destroy'd them inline. With pool size 1U on each of those classes, an assertion failure mid-body skips both Destroys and leaks the slot, so the next test's Create returns the shared Null* fallback and the cascade obscures the original failure. Pre-S11.09 this couldn't happen because the storage was a stack-local that vanished on test exit; the migration to pool-backed Create introduced the leak window. Move the handles to fixture members; setup nulls them; teardown conditionally destroys whichever a test body assigned. Matches the existing fixture pattern for `buffer` / `store` / `fakeSender`. All 1277 tests still pass; tidy / cppcheck / clang-format / IWYU clean. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
Worked through the CodeRabbit review. Status:
Plus a clang-format fix ( All local gates green: debug + 1277 tests, sanitize, coverage, tidy, cppcheck, format, IWYU, OpenSSL integration (9/9). |
☀️ Quality Summary 🚦 build-linux-gcc: 100% successful (✔️ 1283 passed, 🙈 2 skipped) Created by Quality Monitor v1.14.0 (#f3859fd). More details are shown in the GitHub Checks Result. |
Purpose
Closes #412. Closes out E11's class-by-class migration with the four storage-cast classes that don't fit one platform umbrella —
StdAtomicCounter,WindowsAtomicCounter,FatFsFile,TlsStream. Each gets the canonical 3-TU split (Class.c+ClassPrivate.h+ClassStatic.c) +SolidSyslogPoolAllocator, with the public<Class>Storagetypedef andSOLIDSYSLOG_*_SIZEenum deleted from each public header.After this lands, only S11.10 (
SolidSyslogcore retrofit) and S11.11 (wholesale MISRAD.002storage-cast deviation cleanup) remain in E11. Per pre-flight agreement those stay as separate stories.Change Description
Five commits on the branch (squash-merge collapses to one on
main):feat: S11.09 add SolidSyslogNullAtomicCounter— new public GoF null withIncrementreturning1Uunconditionally. RFC 5424 §7.3.1 forbids sequenceId0;1Uis indistinguishable from post-power-on / post-wrap state, which is the safest fallback. Symmetric with the S11.06 wave (NullDatagram / NullStream / NullFile / NullResolver)._Getis silent — the bad-setup error fires from*Static.c::Createat pool exhaustion, matching the existing contract.refactor: S11.09 migrate AtomicCounter family onto PoolAllocator— Std + Windows backends in one commit (not two as the story body sequenced them). The two backends share theTestAtomicCounter_*shim signature inTests/SolidSyslogAtomicCounterTestHelper.h; splitting per backend would leave the inactive platform's compile broken between commits. Combined commit preserves the per-commit must-compile invariant. AddsTestAtomicCounter_PoolSize()so the backend-agnostic contract test can runtime-gate the two-counter independence scenario.refactor: S11.09 migrate FatFsFile onto PoolAllocator— deletes theSOLIDSYSLOG_FATFS_FILE_SIZE = sizeof(intptr_t) * 180Uenum from the public header (the 180-intptr footprint driven byFF_MAX_SS=512andFIL's sector buffer is now an internal pool concern). The planned S21.03 follow-up that was going to makeFF_MAX_SS > 512overridable becomes simpler — it's now a pool-internal CMake tunable, not a public-API concern.refactor: S11.09 migrate TlsStream onto PoolAllocator— largest of the four (~460 lines pre-migration). Refactor-only: bounded handshake retry via the injected Sleep callback, mTLS all-or-nothing client-identity contract, BIO_METHOD lifecycle, SSL_read fail-fast on non-WANT_READ, idempotent Close all preserved verbatim. Drops one obsolete test (CreateReturnsHandleInsideCallerSuppliedStorage— asserted the storage-cast invariant which no longer holds).docs: update DEVLOG for S11.09— per-commit narrative, decisions, per-class delta numbers, handoff notes.Public API changes
SolidSyslog{Std,Windows}AtomicCounterStorage,SolidSyslogFatFsFileStorage,SolidSyslogTlsStreamStoragetypedefs and theirSOLIDSYSLOG_*_SIZEenums deleted from public headers. New tunables:SOLIDSYSLOG_{STD,WINDOWS}_ATOMIC_COUNTER_POOL_SIZE,SOLIDSYSLOG_FATFS_FILE_POOL_SIZE,SOLIDSYSLOG_TLS_STREAM_POOL_SIZE(all default1U).Decisions worth flagging
SolidSyslogNullAtomicCounter.NullStream(S11.06) coversTlsStream;NullFile(S11.06) coversFatFsFile.TestAtomicCounter_PoolSize()helper lets the backend-agnostic test detect when the pool isn't big enough and TEST_EXIT cleanly. Thetunable-override-debugpreset bumps both AtomicCounter pool sizes to 2 so the gated test actually runs in CI._Init(uint32_t)helper (used by the wraparound-at-INT32_MAX contract test) stays in*.calongside_Increment. The TestHelper still#includes the.cwhitebox and now also sees the struct via*Private.h.DEFAULT_INSTANCE/DESTROYED_INSTANCEstatic consts go away.Initialisesets vtable fields + zeroes Ctx/Ssl/BioMethod explicitly;Cleanupoverwrites the abstract base with*SolidSyslogNullStream_Get(). Matches every other 3-TU-migrated class.Test Evidence
Per-class Pool TEST_GROUPs (9 tests each) mirror
SolidSyslogWindowsMutexPool's canonical shape:SolidSyslogStdAtomicCounterPool— 9 tests, gcc/clangSolidSyslogWindowsAtomicCounterPool— 9 tests, MSVC onlySolidSyslogFatFsFilePool— 9 tests, freertos-host (only place FatFs sources compile)SolidSyslogTlsStreamPool— 9 tests, gcc/clang with OpenSSLSolidSyslogNullAtomicCounter— 2 tests (returns 1, idempotent).Existing tests migrated mechanically (drop
*Storagelocals, switch to handle-based teardown). One obsolete test removed (TlsStream::CreateReturnsHandleInsideCallerSuppliedStorage).Local validation
Tests/FileFake.c:424from S10.04 unrelated to this PRSolidSyslogStdAtomicCounter.c20/20,SolidSyslogStdAtomicCounterStatic.c26/26SolidSyslogNullAtomicCounter.c4/4SolidSyslogFatFsFile.c+SolidSyslogFatFsFileStatic.c83/83 (via the separateSolidSyslogFatFsFileTestbinary)SolidSyslogTlsStream.c183/183,SolidSyslogTlsStreamStatic.c26/26SolidSyslogNullAtomicCounter.cafter the first consumer landed — folded into the AtomicCounter migration commit)Per-class re-run at
SOLIDSYSLOG_<CLASS>_POOL_SIZE=3viaSOLIDSYSLOG_USER_TUNABLES_FILE: green (thetunable-override-debugpreset already exercises this via the bumped AtomicCounter tunables).CI-only gates remaining
Per pre-flight agreement MSVC validation moves to CI for this story (departing from
feedback_local_msvcfor S11.09 specifically — the existingbuild-windows-msvc+integration-windows-openssljobs cover the surface):build-windows-msvc—WindowsAtomicCounter+ TlsStream/Winsock BDD targetbdd-windows-otel— exercisesTlsStream_Create(&config)against the cert-validated syslog-ng oraclebdd-freertos-qemu— exercises FatFsFile pool migration viaset store fileBDD scenarioanalyze-iwyu— already validated locally, CI re-runsAreas Affected
Platform/Atomics/—StdAtomicCounter3-TU split + new Private headerPlatform/Windows/—WindowsAtomicCounter3-TU split + new Private header (no change to other Windows classes)Platform/FatFs/—FatFsFile3-TU split + new Private header; INTERFACE library shape preservedPlatform/OpenSsl/—TlsStream3-TU split + new Private headerCore/Interface/SolidSyslogTunablesDefaults.h— four new pool-size tunablesCore/Source/SolidSyslogErrorMessages.h— four new pool-exhaustion / unknown-destroy message constantsCore/Interface/SolidSyslogNullAtomicCounter.h+Core/Source/SolidSyslogNullAtomicCounter.c— new public GoF nullTests/— new*PoolTest.cppfiles; contract test runtime-gated on pool size; existing tests mechanically migrated;TestAtomicCounter_PoolSize()helper addedTests/Fixtures/SmallMessageSizeTunables.h— bumps both AtomicCounter pool sizes to 2UBdd/Targets/—counterStorage/storeFileStorage/tlsStreamStoragelocals dropped from Linux, Windows, FreeRtos main + the two TLS senders + the OpenSSL integration testCLAUDE.md— audience-table rows updated for StdAtomicCounter, WindowsAtomicCounter, FatFsFile, TlsStream; new NullAtomicCounter row addedDEVLOG.md— S11.09 entrySummary by CodeRabbit
New Features
Improvements
Tests