diff --git a/reactor/Core/src/jetbrains/mps/logic/reactor/core/Occurrence.kt b/reactor/Core/src/jetbrains/mps/logic/reactor/core/Occurrence.kt index 5a1b8940..976816c1 100644 --- a/reactor/Core/src/jetbrains/mps/logic/reactor/core/Occurrence.kt +++ b/reactor/Core/src/jetbrains/mps/logic/reactor/core/Occurrence.kt @@ -39,14 +39,14 @@ class Occurrence (observable: LogicalStateObservable, ConstraintOccurrence, ForwardingLogicalObserver, Justified { - var alive = true + var alive = false var stored = false val identity = System.identityHashCode(this) init { - revive(observable) +// revive(observable) } override fun constraint(): Constraint = constraint @@ -64,18 +64,22 @@ class Occurrence (observable: LogicalStateObservable, override fun parentUpdated(logical: Logical<*>, controller: Controller) = doReactivate(controller) fun terminate(observable: LogicalStateObservable) { - for (a in arguments) { - if (a is Logical<*>) { - observable.removeForwardingObserver(a, this) + if (alive) { + for (a in arguments) { + if (a is Logical<*>) { + observable.removeForwardingObserver(a, this) + } } } alive = false } fun revive(observable: LogicalStateObservable) { - for (a in arguments) { - if (a is Logical<*>) { - observable.addForwardingObserver(a, this) + if (!alive) { + for (a in HashSet(arguments)) { // avoid duplicate subscriptions + if (a is Logical<*>) { + observable.addForwardingObserver(a, this) + } } } alive = true diff --git a/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/ConstraintsProcessing.kt b/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/ConstraintsProcessing.kt index 25ebba97..e2b32b5f 100644 --- a/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/ConstraintsProcessing.kt +++ b/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/ConstraintsProcessing.kt @@ -212,7 +212,6 @@ internal class ConstraintsProcessing(private var dispatchingFront: Dispatcher.Di */ fun processActivated(controller: Controller, active: Occurrence, parent: MatchJournal.MatchChunk, inStatus: FeedbackStatus) : FeedbackStatus { push() - assert(active.alive) val activationChunk: MatchJournal.OccChunk? if (!active.stored) { @@ -223,6 +222,7 @@ internal class ConstraintsProcessing(private var dispatchingFront: Dispatcher.Di // defined (not null) & needed only for incremental execution activationChunk = journalIndex.activatingChunkOf(active) } + assert(active.alive) profiler.profile("dispatch_${active.constraint().symbol()}") {