Wrap the `getValue` logic in a `performMap` to ensure thread safety

pull/1061/head
Morgan Pretty 1 month ago
parent 2642d3925e
commit e1f38f3761

@ -386,14 +386,18 @@ private extension Dependencies {
/// Convenience method to retrieve the existing dependency instance from memory in a thread-safe way /// Convenience method to retrieve the existing dependency instance from memory in a thread-safe way
private func getValue<T>(_ key: String, of variant: DependencyStorage.Key.Variant) -> T? { private func getValue<T>(_ key: String, of variant: DependencyStorage.Key.Variant) -> T? {
guard let typedValue: DependencyStorage.Value = storage.instances[variant.key(key)] else { return nil } return _storage.performMap { storage in
guard let result: T = typedValue.value(as: T.self) else { guard let typedValue: DependencyStorage.Value = storage.instances[variant.key(key)] else {
/// If there is a value stored for the key, but it's not the right type then something has gone wrong, and we should log return nil
Log.critical("Failed to convert stored dependency '\(variant.key(key))' to expected type: \(T.self)") }
return nil guard let result: T = typedValue.value(as: T.self) else {
/// If there is a value stored for the key, but it's not the right type then something has gone wrong, and we should log
Log.critical("Failed to convert stored dependency '\(variant.key(key))' to expected type: \(T.self)")
return nil
}
return result
} }
return result
} }
/// Convenience method to store a dependency instance in memory in a thread-safe way /// Convenience method to store a dependency instance in memory in a thread-safe way

Loading…
Cancel
Save