From 0a615e6d788d8b741948f6039f2f20208be4be64 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Wed, 16 Mar 2022 19:35:14 +0600 Subject: [PATCH] cancel jobs of completed states in DefaultStatesMachine --- CHANGELOG.md | 1 + .../dev/inmo/micro_utils/fsm/common/StatesMachine.kt | 10 ++++++++++ .../fsm/common/managers/DefaultStatesManager.kt | 1 + 3 files changed, 12 insertions(+) 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) }