Skip to content

app: quiesce the fan pipeline and drain the pump before the exit resetAuto - #77

Open
iBobbyTS wants to merge 1 commit into
ProducerGuy:mainfrom
iBobbyTS:fix/quit-drain-pump
Open

iBobbyTS wants to merge 1 commit into
ProducerGuy:mainfrom
iBobbyTS:fix/quit-drain-pump

Conversation

@iBobbyTS

Copy link
Copy Markdown

Problem

applicationWillTerminate runs its synchronous resetAuto while 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:

  1. stop the monitor's ticks and reject new submits (a terminating flag guards the onFanCommand hop into the pump),
  2. 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),
  3. only then does the exit resetAuto run, 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 + full swift test pass, 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.

…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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant