summaryrefslogtreecommitdiff
path: root/odcsim-engine-omega
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2019-05-08 11:42:05 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2019-05-14 12:55:56 +0200
commit1f77d1011577c54e98ad0cbbd898817f98000881 (patch)
tree8ee70617f9fa7234f7b78d5056e59677979adc5e /odcsim-engine-omega
parent791aa01938aef966ff3c0f2cd31d2aebdccddb6f (diff)
feat: Add support for spawning anonymous children
This change adds support for spawning anonymous children in an ActorContext. This means a name does not have to be specified when spawning an actor.
Diffstat (limited to 'odcsim-engine-omega')
-rw-r--r--odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystem.kt12
1 files changed, 11 insertions, 1 deletions
diff --git a/odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystem.kt b/odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystem.kt
index 8930fb96..37b5395f 100644
--- a/odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystem.kt
+++ b/odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystem.kt
@@ -38,10 +38,10 @@ import com.atlarge.odcsim.Signal
import com.atlarge.odcsim.Terminated
import com.atlarge.odcsim.internal.BehaviorInterpreter
import com.atlarge.odcsim.internal.logging.LoggerImpl
-import com.sun.xml.internal.messaging.saaj.soap.impl.EnvelopeImpl
import org.slf4j.Logger
import java.util.Collections
import java.util.PriorityQueue
+import java.util.UUID
import java.util.WeakHashMap
import kotlin.math.max
@@ -155,6 +155,16 @@ class OmegaActorSystem<in T : Any>(root: Behavior<T>, override val name: String)
override fun <U : Any> send(ref: ActorRef<U>, msg: U, after: Duration) = schedule(ref, msg, after)
override fun <U : Any> spawn(behavior: Behavior<U>, name: String): ActorRef<U> {
+ require(!name.startsWith("$")) { "Name may not start with $-sign" }
+ return internalSpawn(behavior, name)
+ }
+
+ override fun <U : Any> spawnAnonymous(behavior: Behavior<U>): ActorRef<U> {
+ val name = "$" + UUID.randomUUID()
+ return internalSpawn(behavior, name)
+ }
+
+ private fun <U : Any> internalSpawn(behavior: Behavior<U>, name: String): ActorRef<U> {
val ref = ActorRefImpl<U>(this@OmegaActorSystem, self.path.child(name))
if (ref.path !in registry) {
val actor = Actor(ref, behavior)