Fixed lock recursiveness

This commit is contained in:
rnkorneeva
2024-02-02 15:30:54 +03:00
parent d213ddf2d1
commit 0f3fbda33b
2 changed files with 23 additions and 16 deletions
@@ -19,10 +19,14 @@ public final class DivVariableStorage {
/// Gets all available variables including variables from outer storage.
public var allValues: DivVariables {
lock.read {
(outerStorage?.allValues ?? [:]) + values
_allValues
}
}
private var _allValues: DivVariables {
(outerStorage?.allValues ?? [:]) + values
}
private let changeEventsPipe = SignalPipe<ChangeEvent>()
let changeEvents: Signal<ChangeEvent>
@@ -69,12 +73,13 @@ public final class DivVariableStorage {
/// Updates variable value if a variable with the given name already exists.
/// Does not affect outer storage.
public func put(name: DivVariableName, value: DivVariableValue) {
var oldValues: DivVariables = [:]
lock.write {
let oldValues = allValues
oldValues = _allValues
values[name] = value
if oldValues[name] != value {
notify(ChangeEvent(changedVariables: [name], oldValues: oldValues))
}
}
if oldValues[name] != value {
notify(ChangeEvent(changedVariables: [name], oldValues: oldValues))
}
}
@@ -85,21 +90,21 @@ public final class DivVariableStorage {
_ variables: DivVariables,
notifyObservers: Bool = true
) {
let oldValues = allValues
var changedVariables = Set<DivVariableName>()
lock.write {
let oldValues = allValues
values = values + variables
if notifyObservers {
var changedVariables = Set<DivVariableName>()
for (name, value) in variables {
if oldValues[name] != value {
changedVariables.insert(name)
}
}
if !changedVariables.isEmpty {
notify(ChangeEvent(changedVariables: changedVariables, oldValues: oldValues))
}
}
}
if !changedVariables.isEmpty {
notify(ChangeEvent(changedVariables: changedVariables, oldValues: oldValues))
}
}
/// Replaces all variables with new ones in single transaction.
@@ -195,6 +195,7 @@ extension DivVariablesStorage: DivVariableUpdater {
name: DivVariableName,
valueFactory: (DivVariableValue) -> DivVariableValue?
) {
var changeEvent: ChangeEvent? = nil
lock.write {
var variables = cardVariables[cardId]
if let oldValue = variables?[name] {
@@ -204,17 +205,18 @@ extension DivVariablesStorage: DivVariableUpdater {
let oldValues = allValues
variables?[name] = newValue
cardVariables[cardId] = variables
notify(
ChangeEvent(
kind: .local(cardId, [name]),
oldValues: oldValues,
newValues: allValues
)
changeEvent = ChangeEvent(
kind: .local(cardId, [name]),
oldValues: oldValues,
newValues: allValues
)
} else {
globalStorage.update(name: name, valueFactory: valueFactory)
}
}
if let changeEvent {
notify(changeEvent)
}
}
}