Skip to content

Commit 97e7c3a

Browse files
committed
fix(appstate): replace isolated deinit with nonisolated(unsafe) cleanup
The production release compiler rejects `isolated deinit` (SE-0371) as an experimental feature and won't let it be enabled, so `swift build -c release` (the DMG build) failed. Use a plain deinit and mark the torn-down stored properties nonisolated(unsafe) — runtime behavior is unchanged and no experimental feature is required.
1 parent 15765b2 commit 97e7c3a

1 file changed

Lines changed: 11 additions & 7 deletions

File tree

Sources/CodeIsland/AppState.swift

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -112,19 +112,19 @@ final class AppState {
112112
}
113113

114114
private var maxHistory: Int { SettingsManager.shared.maxToolHistory }
115-
private var cleanupTimer: Timer?
115+
nonisolated(unsafe) private var cleanupTimer: Timer?
116116
private var autoCollapseTask: Task<Void, Never>?
117117
private var completionQueue: [String] = []
118118
/// Mouse must enter the panel before auto-collapse is allowed (prevents instant dismiss)
119119
var completionHasBeenEntered = false
120120
/// Auto-collapse timer fired but mouse is inside panel — defer collapse until mouse leaves
121121
var deferCollapseOnMouseLeave = false
122-
private var processMonitors: [String: (source: DispatchSourceProcess, process: ProcessIdentity)] = [:]
122+
nonisolated(unsafe) private var processMonitors: [String: (source: DispatchSourceProcess, process: ProcessIdentity)] = [:]
123123
private var exitingSessions: [String: ProcessIdentity] = [:]
124-
private var saveTimer: Timer?
125-
private var fsEventStream: FSEventStreamRef?
124+
nonisolated(unsafe) private var saveTimer: Timer?
125+
nonisolated(unsafe) private var fsEventStream: FSEventStreamRef?
126126
private var lastFSScanTime: Date = .distantPast
127-
private var discoveryScanTask: Task<Void, Never>?
127+
nonisolated(unsafe) private var discoveryScanTask: Task<Void, Never>?
128128
private var pendingDiscoveryRescan = false
129129
private var isShowingCompletion: Bool {
130130
if case .completionCard = surface { return true }
@@ -152,7 +152,7 @@ final class AppState {
152152
guard let rid = rotatingSessionId else { return nil }
153153
return sessions[rid]
154154
}
155-
private var rotationTimer: Timer?
155+
nonisolated(unsafe) private var rotationTimer: Timer?
156156

157157
private func startCleanupTimer() {
158158
guard cleanupTimer == nil else { return }
@@ -2523,7 +2523,11 @@ final class AppState {
25232523
for key in Array(processMonitors.keys) { stopMonitor(key) }
25242524
}
25252525

2526-
isolated deinit {
2526+
// Plain (nonisolated) deinit: the accessed stored properties are marked
2527+
// `nonisolated(unsafe)` so they can be torn down here. `isolated deinit`
2528+
// (SE-0371) is rejected by the production release compiler, so it can't be
2529+
// used. At dealloc there are no other references, so these accesses don't race.
2530+
deinit {
25272531
rotationTimer?.invalidate()
25282532
cleanupTimer?.invalidate()
25292533
saveTimer?.invalidate()

0 commit comments

Comments
 (0)