Fixes deadlock when getting/setting progress for an app

This commit is contained in:
Riley Testut
2023-10-27 18:22:17 -05:00
committed by Magesh K
parent 140193c040
commit 583de6c0ec

View File

@@ -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
}
}
}