Repository navigation
Conversation
…tAuto applicationWillTerminate ran its synchronous resetAuto while the monitor was still ticking and the command pump could still hold an in-flight or pending write. That write lands at the daemon AFTER the exit resetAuto and re-pins the fans in manual — with the app gone, they stay pinned until the daemon watchdog reverts them. The quit path now quiesces first, in order: stop the monitor's ticks and reject new submits (a terminating flag guards the onFanCommand hop), then flush() — a new synchronous barrier on the pump's queue that blocks until every command submitted before it has executed. Only then does the exit resetAuto run, so nothing can supersede it. The AppDelegate holds the AppState reference (handed over in ThermalForgeApp.init) to reach the pipeline at quit time. Two pump tests cover the barrier: flush returns only after in-flight and pending writes have executed, and the pump still serves submits made after a flush.
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.
Problem
applicationWillTerminateruns its synchronousresetAutowhile the monitor is still ticking and the command pump may still hold an in-flight or pending write. That write lands at the daemon after the exit resetAuto and re-pins the fans in manual — with the app gone, they stay pinned until the daemon watchdog reverts them.Fix
The quit path now quiesces first, in order:
terminatingflag guards theonFanCommandhop into the pump),flush()— a new synchronous barrier on the pump's queue that blocks until every command submitted before it has executed (the barrier block itself drains, closing the append-vs-kick window),resetAutorun, so nothing can supersede it.The AppDelegate holds the AppState reference (handed over in
ThermalForgeApp.init, same instance as the@StateObject) to reach the pipeline at quit time.Testing
swift build+ fullswift testpass, including two new pump tests: flush returns only after in-flight and pending writes have executed, and the pump still serves submits made after a flush.