diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a34dbc6b2c..aea19450f9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ * `FSM`: * Rename `DefaultUpdatableStatesMachine#compare` to `DefaultUpdatableStatesMachine#shouldReplaceJob` * `DefaultStatesManager` now is extendable + * `DefaultStatesMachine` will stop all jobs of states which was removed from `statesManager` ## 0.9.14 diff --git a/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/StatesMachine.kt b/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/StatesMachine.kt index 4a72a715784..cc8fe265ef4 100644 --- a/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/StatesMachine.kt +++ b/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/StatesMachine.kt @@ -105,6 +105,16 @@ open class DefaultStatesMachine ( statesManager.onChainStateUpdated.subscribeSafelyWithoutExceptions(this) { 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 { launch { performStateUpdate(Optional.absent(), it, scope.LinkedSupervisorScope()) } diff --git a/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/managers/DefaultStatesManager.kt b/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/managers/DefaultStatesManager.kt index 426b70fd5d6..4c67a5fbd31 100644 --- a/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/managers/DefaultStatesManager.kt +++ b/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/managers/DefaultStatesManager.kt @@ -61,6 +61,7 @@ open class DefaultStatesManager( when { stateByOldContext != old -> return@withLock stateByOldContext == null || old.context == new.context -> { + repo.removeState(old) repo.set(new) _onChainStateUpdated.emit(old to new) }