summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2008-12-15 10:19:01 +0000
committerPhilipp Haller <hallerp@gmail.com>2008-12-15 10:19:01 +0000
commit7d0f549c1248f779b78bb85b12b2b443ec77eb9b (patch)
treebc50d58821a59f082260933bd20896528c377c1d
parent006d0976196202e117269994cbbe091111d75e19 (diff)
downloadscala-7d0f549c1248f779b78bb85b12b2b443ec77eb9b.tar.gz
scala-7d0f549c1248f779b78bb85b12b2b443ec77eb9b.tar.bz2
scala-7d0f549c1248f779b78bb85b12b2b443ec77eb9b.zip
Remove race condition when linking/unlinking.
-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)