summaryrefslogtreecommitdiff
path: root/opendc-kernel-omega/src/main
diff options
context:
space:
mode:
authorFabian Mastenbroek <fabianishere@outlook.com>2018-07-17 16:20:47 +0200
committerGitHub <noreply@github.com>2018-07-17 16:20:47 +0200
commit28974348022dc7c339359ffb099ec55d2c76e457 (patch)
treea5b6c16f28dc803f3a2e6269b79e98c4e4881a96 /opendc-kernel-omega/src/main
parentebd8c8ee83704605241edf08c22df3562f52e689 (diff)
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
Diffstat (limited to 'opendc-kernel-omega/src/main')
-rw-r--r--opendc-kernel-omega/src/main/kotlin/com/atlarge/opendc/omega/OmegaSimulation.kt12
1 files changed, 8 insertions, 4 deletions
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<M>(bootstrap: Bootstrap<M>) : Simulation<M>, 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<M>(bootstrap: Bootstrap<M>) : Simulation<M>, Boot
/**
* The continuation to resume the execution of the process.
*/
- lateinit var continuation: Continuation<Envelope>
+ var continuation: Continuation<Envelope>? = null
/**
* The last point in time the process has done some work.