From 28974348022dc7c339359ffb099ec55d2c76e457 Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Tue, 17 Jul 2018 16:20:47 +0200 Subject: bug: Fix crashed processes from being resumed (#28) This change fixes a bug where a process would be resumed again after it had crashed, bringing down the kernel. Fixes #27 --- .../main/kotlin/com/atlarge/opendc/omega/OmegaSimulation.kt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'opendc-kernel-omega/src/main') diff --git a/opendc-kernel-omega/src/main/kotlin/com/atlarge/opendc/omega/OmegaSimulation.kt b/opendc-kernel-omega/src/main/kotlin/com/atlarge/opendc/omega/OmegaSimulation.kt index 4e3aa16c..fbb4a270 100644 --- a/opendc-kernel-omega/src/main/kotlin/com/atlarge/opendc/omega/OmegaSimulation.kt +++ b/opendc-kernel-omega/src/main/kotlin/com/atlarge/opendc/omega/OmegaSimulation.kt @@ -184,11 +184,15 @@ internal class OmegaSimulation(bootstrap: Bootstrap) : Simulation, Boot } val context = envelope.destination.context ?: continue + val continuation = context.continuation ?: continue - if (envelope.message !is Interrupt) { - context.continuation.resume(envelope) + // Clear the continuation to prevent resuming an already resumed continuation + context.continuation = null + + if (envelope.message is Interrupt) { + continuation.resumeWithException(envelope.message) } else { - context.continuation.resumeWithException(envelope.message) + continuation.resume(envelope) } context.last = time @@ -335,7 +339,7 @@ internal class OmegaSimulation(bootstrap: Bootstrap) : Simulation, Boot /** * The continuation to resume the execution of the process. */ - lateinit var continuation: Continuation + var continuation: Continuation? = null /** * The last point in time the process has done some work. -- cgit v1.2.3