From 58be8ffb2b31f7a2c5b81e96cbd5ba8ba95e2dee Mon Sep 17 00:00:00 2001 From: Riley Testut Date: Fri, 27 Oct 2023 18:22:17 -0500 Subject: [PATCH] Fixes deadlock when getting/setting progress for an app --- AltStore/Managing Apps/AppManager.swift | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/AltStore/Managing Apps/AppManager.swift b/AltStore/Managing Apps/AppManager.swift index 66dd9121..fdbca9bf 100644 --- a/AltStore/Managing Apps/AppManager.swift +++ b/AltStore/Managing Apps/AppManager.swift @@ -1960,25 +1960,31 @@ private extension AppManager func progress(for operation: AppOperation) -> Progress? { + // Access outside critical section to avoid deadlock due to `bundleIdentifier` potentially calling performAndWait() on main thread. + let bundleID = operation.bundleIdentifier + os_unfair_lock_lock(self.progressLock) defer { os_unfair_lock_unlock(self.progressLock) } switch operation { - case .install, .update: return self.installationProgress[operation.bundleIdentifier] - case .refresh, .activate, .deactivate, .backup, .restore: return self.refreshProgress[operation.bundleIdentifier] + case .install, .update: return self.installationProgress[bundleID] + case .refresh, .activate, .deactivate, .backup, .restore: return self.refreshProgress[bundleID] } } func set(_ progress: Progress?, for operation: AppOperation) { + // Access outside critical section to avoid deadlock due to `bundleIdentifier` potentially calling performAndWait() on main thread. + let bundleID = operation.bundleIdentifier + os_unfair_lock_lock(self.progressLock) defer { os_unfair_lock_unlock(self.progressLock) } switch operation { - case .install, .update: self.installationProgress[operation.bundleIdentifier] = progress - case .refresh, .activate, .deactivate, .backup, .restore: self.refreshProgress[operation.bundleIdentifier] = progress + case .install, .update: self.installationProgress[bundleID] = progress + case .refresh, .activate, .deactivate, .backup, .restore: self.refreshProgress[bundleID] = progress } } }