Compare commits

...

2 Commits

Author SHA1 Message Date
Kotov Max
4a3a347bea
Merge 74e99ecc51 into 0301741002 2024-04-09 11:57:52 +05:30
Kotov Max
74e99ecc51 Fix data races in SettingsBuilder.
**Reason:**
- `configFileSettings` and `settingPresetSettings` caches were just global dictionaries. Data races were taken place at these points when multiple projects are generated in parallel.

**Content:**
- Dictionaries for caches moved to NSCache which is thread safe.
2022-07-21 14:12:03 +03:00
2 changed files with 39 additions and 14 deletions

View File

@ -0,0 +1,37 @@
import XcodeProj
import Foundation
enum Cached<T> {
case cached(T)
case nothing
var value: T? {
switch self {
case let .cached(value): return value
case .nothing: return nil
}
}
}
final class CacheContainer {
let value: Cached<BuildSettings>
init(value: Cached<BuildSettings>) {
self.value = value
}
}
extension NSCache where KeyType == NSString, ObjectType == CacheContainer {
subscript(aKey: String) -> Cached<BuildSettings>? {
get {
object(forKey: aKey as NSString)?.value
}
set {
if let value = newValue {
setObject(CacheContainer(value: value), forKey: aKey as NSString)
} else {
removeObject(forKey: aKey as NSString)
}
}
}
}

View File

@ -207,23 +207,11 @@ extension Project {
}
}
private enum Cached<T> {
case cached(T)
case nothing
var value: T? {
switch self {
case let .cached(value): return value
case .nothing: return nil
}
}
}
// cached flattened xcconfig file settings
private var configFileSettings: [String: Cached<BuildSettings>] = [:]
private var configFileSettings = NSCache<NSString, CacheContainer>()
// cached setting preset settings
private var settingPresetSettings: [String: Cached<BuildSettings>] = [:]
private var settingPresetSettings = NSCache<NSString, CacheContainer>()
extension SettingsPresetFile {