diff options
author | Philipp Haller <hallerp@gmail.com> | 2008-12-15 10:19:01 +0000 |
---|---|---|
committer | Philipp Haller <hallerp@gmail.com> | 2008-12-15 10:19:01 +0000 |
commit | 7d0f549c1248f779b78bb85b12b2b443ec77eb9b (patch) | |
tree | bc50d58821a59f082260933bd20896528c377c1d | |
parent | 006d0976196202e117269994cbbe091111d75e19 (diff) | |
download | scala-7d0f549c1248f779b78bb85b12b2b443ec77eb9b.tar.gz scala-7d0f549c1248f779b78bb85b12b2b443ec77eb9b.tar.bz2 scala-7d0f549c1248f779b78bb85b12b2b443ec77eb9b.zip |
Remove race condition when linking/unlinking.
-rw-r--r-- | src/actors/scala/actors/Actor.scala | 12 |
1 files changed, 8 insertions, 4 deletions
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) |