mirror of
https://github.com/divkit/divkit.git
synced 2026-06-06 20:07:59 +00:00
Fixed lock recursiveness
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user