From 8836f6c0f0ad4b39972d9a8979aaf2b705d24c69 Mon Sep 17 00:00:00 2001 From: Philipp Haller Date: Mon, 15 Dec 2008 11:01:56 +0000 Subject: Remove race condition when linking/unlinking. --- src/actors/scala/actors/Actor.scala | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'src/actors') diff --git a/src/actors/scala/actors/Actor.scala b/src/actors/scala/actors/Actor.scala index 384bfadc1a..af94a8a4e7 100644 --- a/src/actors/scala/actors/Actor.scala +++ b/src/actors/scala/actors/Actor.scala @@ -818,7 +818,9 @@ trait Actor extends AbstractActor { */ def link(to: AbstractActor): AbstractActor = { assert(Actor.self == this, "link called on actor different from self") - links = to :: links + synchronized { + links = to :: links + } to.linkTo(this) to } @@ -844,7 +846,9 @@ trait Actor extends AbstractActor { */ def unlink(from: AbstractActor) { assert(Actor.self == this, "unlink called on actor different from self") - links = links.remove(from.==) + synchronized { + links = links.remove(from.==) + } from.unlinkFrom(this) } @@ -892,9 +896,9 @@ trait Actor extends AbstractActor { private[actors] def exitLinked() { exiting = true // remove this from links - links = links.remove(this.==) + val mylinks = links.remove(this.==) // exit linked processes - links.foreach((linked: AbstractActor) => { + mylinks.foreach((linked: AbstractActor) => { unlink(linked) if (!linked.exiting) linked.exit(this, exitReason) -- cgit v1.2.3