Follow-ups to the Idle-vs-Error acquisition failure split:
- JFJochServices::Stop: raise the critical detector fault BEFORE the ordinary
receiver/writer exception. Both can be set at once (detector not idle, then
receiver->Stop() also throws); throwing the ordinary one first masked the
detector fault and returned the broker to Idle instead of Error, skipping the
required re-initialisation.
- SLSDetectorWrapper::Stop/Deactivate: rethrow a JFJochException as-is (as Start
already does) so InternalStop's JFJochCriticalException is not downgraded to an
ordinary JFJochException by the generic catch.
- JFJochServices::Start: wrap the whole best-effort receiver cleanup (Cancel +
Stop) in the catch so a throwing Cancel cannot replace the original detector
exception before it is re-raised.
Also fix the "cannot create indexing pool" failure seen when retrying
initialize after a failed acquisition start: a failed start leaves the receiver
(and its GPU resources) alive until the next Start, but the retried initialize
rebuilds the indexer pool first, so the fresh GPU indexer had to coexist with
the stale receiver and its init failed. JFJochReceiverService::Indexing now
releases the previous receiver before (re)building the pool (safe: only runs
when the receiver is idle), which also removes a dangling pool pointer held by
that receiver.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>