cancel jobs of completed states in DefaultStatesMachine

This commit is contained in:
InsanusMokrassar 2022-03-16 19:35:14 +06:00
parent 8f928e16e1
commit 0a615e6d78
3 changed files with 12 additions and 0 deletions

View File

@ -5,6 +5,7 @@
* `FSM`: * `FSM`:
* Rename `DefaultUpdatableStatesMachine#compare` to `DefaultUpdatableStatesMachine#shouldReplaceJob` * Rename `DefaultUpdatableStatesMachine#compare` to `DefaultUpdatableStatesMachine#shouldReplaceJob`
* `DefaultStatesManager` now is extendable * `DefaultStatesManager` now is extendable
* `DefaultStatesMachine` will stop all jobs of states which was removed from `statesManager`
## 0.9.14 ## 0.9.14

View File

@ -105,6 +105,16 @@ open class DefaultStatesMachine <T: State>(
statesManager.onChainStateUpdated.subscribeSafelyWithoutExceptions(this) { statesManager.onChainStateUpdated.subscribeSafelyWithoutExceptions(this) {
launch { performStateUpdate(Optional.presented(it.first), it.second, scope.LinkedSupervisorScope()) } launch { performStateUpdate(Optional.presented(it.first), it.second, scope.LinkedSupervisorScope()) }
} }
statesManager.onEndChain.subscribeSafelyWithoutExceptions(this) { removedState ->
launch {
statesJobsMutex.withLock {
val stateInMap = statesJobs.keys.firstOrNull { stateInMap -> stateInMap == removedState }
if (stateInMap === removedState) {
statesJobs[stateInMap] ?.cancel()
}
}
}
}
statesManager.getActiveStates().forEach { statesManager.getActiveStates().forEach {
launch { performStateUpdate(Optional.absent(), it, scope.LinkedSupervisorScope()) } launch { performStateUpdate(Optional.absent(), it, scope.LinkedSupervisorScope()) }

View File

@ -61,6 +61,7 @@ open class DefaultStatesManager<T : State>(
when { when {
stateByOldContext != old -> return@withLock stateByOldContext != old -> return@withLock
stateByOldContext == null || old.context == new.context -> { stateByOldContext == null || old.context == new.context -> {
repo.removeState(old)
repo.set(new) repo.set(new)
_onChainStateUpdated.emit(old to new) _onChainStateUpdated.emit(old to new)
} }