summaryrefslogtreecommitdiff
path: root/src/actors
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2008-12-15 11:01:56 +0000
committerPhilipp Haller <hallerp@gmail.com>2008-12-15 11:01:56 +0000
commit8836f6c0f0ad4b39972d9a8979aaf2b705d24c69 (patch)
tree880eb088867353ab39e888d08fb1fe34bd43fce3 /src/actors
parentc962a00e03542f221ef1a1fc037c7c8b5cd40bca (diff)
downloadscala-8836f6c0f0ad4b39972d9a8979aaf2b705d24c69.tar.gz
scala-8836f6c0f0ad4b39972d9a8979aaf2b705d24c69.tar.bz2
scala-8836f6c0f0ad4b39972d9a8979aaf2b705d24c69.zip
Remove race condition when linking/unlinking.
Diffstat (limited to 'src/actors')
-rw-r--r--src/actors/scala/actors/Actor.scala12
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)