diff options
author | Philipp Haller <hallerp@gmail.com> | 2008-12-15 11:01:56 +0000 |
---|---|---|
committer | Philipp Haller <hallerp@gmail.com> | 2008-12-15 11:01:56 +0000 |
commit | 8836f6c0f0ad4b39972d9a8979aaf2b705d24c69 (patch) | |
tree | 880eb088867353ab39e888d08fb1fe34bd43fce3 /src | |
parent | c962a00e03542f221ef1a1fc037c7c8b5cd40bca (diff) | |
download | scala-8836f6c0f0ad4b39972d9a8979aaf2b705d24c69.tar.gz scala-8836f6c0f0ad4b39972d9a8979aaf2b705d24c69.tar.bz2 scala-8836f6c0f0ad4b39972d9a8979aaf2b705d24c69.zip |
Remove race condition when linking/unlinking.
Diffstat (limited to 'src')
-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) |