Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions LibreLoop/LibreLoopCGMManager/LibreLoopCGMManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -865,6 +865,7 @@ public final class LibreLoopCGMManager: CGMManager {
eventListenerTask = nil
// Drop the live monitor and its BLE link so no session of ours lingers
// on the shared central to collide with a future re-add's handshake.
monitor?.stop()
monitor = nil
if scannerWasInitialized {
scanner.stopScan()
Expand Down
12 changes: 11 additions & 1 deletion LibreLoop/Pairing/LibreLoopCGMManager+Pairing.swift
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,10 @@ extension LibreLoopCGMManager {
let delegate = cgmManagerDelegate
Task { await delegate?.retractAlert(identifier: id) }
}
if let previous = self.monitor, previous !== monitor {
llog("adopt: stopping previous monitor")
previous.stop()
}
self.monitor = monitor
self.connectedAt = Date()
// Fresh session: hasn't streamed a reading yet. Drives the
Expand All @@ -192,7 +196,13 @@ extension LibreLoopCGMManager {
self.lastHistoricalPageAt = nil
monitor.setHandlers(
onReading: { [weak self] sample in self?.ingest(sample) },
onDisconnect: { [weak self] in self?.handleMonitorDisconnect() },
onDisconnect: { [weak self, weak monitor] in
guard let self, let monitor, self.monitor === monitor else {
llog("disconnect from a replaced monitor; ignoring")
return
}
self.handleMonitorDisconnect()
},
onStatus: { [weak self] text in self?.updateStatusDetail(text) },
onHistoricalPage: { [weak self] page in self?.handleHistoricalPage(page) },
onClinicalRecord: { [weak self] record in self?.handleClinicalRecord(record) },
Expand Down
12 changes: 12 additions & 0 deletions LibreLoop/Sensor/LibreLoopSensorMonitor.swift
Original file line number Diff line number Diff line change
Expand Up @@ -427,12 +427,24 @@ public final class LibreLoopSensorMonitor: @unchecked Sendable {
)
}

/// Also drops the handlers: a stopped monitor's stream ends on cancellation,
/// and it must not report that as a disconnect of whatever replaced it.
public func stop() {
lock.lock()
let t = task
task = nil
let wd = silenceWatchdog
silenceWatchdog = nil
readingHandler = nil
disconnectHandler = nil
statusHandler = nil
historicalPageHandler = nil
clinicalRecordHandler = nil
embeddedHistoricalHandler = nil
patchStatusHandler = nil
lifeCountHandler = nil
readyHandler = nil
rawReadHandler = nil
lock.unlock()
t?.cancel()
wd?.cancel()
Expand Down