fix(mlx): add generation counter to prevent stale session operations#38
Merged
Merged
Conversation
The MLXAsrManager singleton was vulnerable to session cross-talk: when a new session started while the old one was still cleaning up, the old provider's stop()/cancel() would hit the new session on the singleton, potentially cancelling or prematurely ending it. Add a monotonically increasing generation counter: - startSession() bumps the counter, cancels any in-flight session, and returns the new generation to the caller - feedAudio(), stop(), cancel() all take a generation parameter and are no-ops if it doesn't match the current generation - The eventTask also checks generation to stop forwarding events from a superseded session The Rust MlxProvider stores the generation from connect() and passes it through all subsequent FFI calls, so an old provider's close() can never affect a newer session.
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.
Why
The MLXAsrManager Swift singleton was vulnerable to session cross-talk:
when a new recording session started while the old one was still cleaning
up, the old provider's
stop()/cancel()would hit the new session onthe singleton, potentially cancelling or prematurely ending it. The Rust-side
Arc isolation (commit 8b22ea8) mitigated the Rust layer but the Swift
singleton still overwrote shared state.
What changed
generationcounter toMLXAsrManager.startSession()increments generation, cancels any in-flight session,and returns the generation to the Rust caller.
feedAudio(),stop(),cancel()all take a generation parameter —calls with a stale generation are silently ignored.
eventTaskchecks generation to stop forwarding events fromsuperseded sessions.
MlxProviderstores the generation fromconnect()and passes itthrough all subsequent FFI calls.
Test plan
cargo check --no-default-features— Rust compilesmakebuilds successfullyinterrupted by old session cleanup