From 583de6c0ec4fa690adad63b82ddcbb75007825ed 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 b3d668c3..0380bb98 100644 --- a/AltStore/Managing Apps/AppManager.swift +++ b/AltStore/Managing Apps/AppManager.swift @@ -2162,25 +2162,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 } } }