summaryrefslogtreecommitdiff
path: root/src/actors/scala/actors/ActorCanReply.scala
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2010-05-09 18:09:17 +0000
committerPhilipp Haller <hallerp@gmail.com>2010-05-09 18:09:17 +0000
commit8fe7b531649dd5f82b6ac46720c751750e893500 (patch)
tree6386d1c0b8a2d07c3f1a6467ede4667cff2b261b /src/actors/scala/actors/ActorCanReply.scala
parentd1185713fa066528eac5f228aae943dd5ad3a142 (diff)
downloadscala-8fe7b531649dd5f82b6ac46720c751750e893500.tar.gz
scala-8fe7b531649dd5f82b6ac46720c751750e893500.tar.bz2
scala-8fe7b531649dd5f82b6ac46720c751750e893500.zip
Closes #3407. Closes #3412. Review by plocinic.
Diffstat (limited to 'src/actors/scala/actors/ActorCanReply.scala')
-rw-r--r--src/actors/scala/actors/ActorCanReply.scala34
1 files changed, 22 insertions, 12 deletions
diff --git a/src/actors/scala/actors/ActorCanReply.scala b/src/actors/scala/actors/ActorCanReply.scala
index a6a81815c1..0f46c1b9de 100644
--- a/src/actors/scala/actors/ActorCanReply.scala
+++ b/src/actors/scala/actors/ActorCanReply.scala
@@ -10,6 +10,8 @@
package scala.actors
+import scala.concurrent.SyncVar
+
/**
* The `ActorCanReply` trait provides message send operations that
* may result in a response from the receiver.
@@ -35,18 +37,26 @@ private[actors] trait ActorCanReply extends ReactorCanReply {
}
override def !![A](msg: Any, handler: PartialFunction[Any, A]): Future[A] = {
- val ftch = new Channel[A](Actor.self(scheduler))
- send(msg, new OutputChannel[Any] {
- def !(msg: Any) =
- ftch ! handler(msg)
- def send(msg: Any, replyTo: OutputChannel[Any]) =
- ftch.send(handler(msg), replyTo)
- def forward(msg: Any) =
- ftch.forward(handler(msg))
- def receiver =
- ftch.receiver
- })
- Futures.fromInputChannel(ftch)
+ val c = new Channel[A](Actor.self(scheduler))
+ val fun = (res: SyncVar[A]) => {
+ val ftch = new Channel[A](Actor.self(scheduler))
+ send(msg, new OutputChannel[Any] {
+ def !(msg: Any) =
+ ftch ! handler(msg)
+ def send(msg: Any, replyTo: OutputChannel[Any]) =
+ ftch.send(handler(msg), replyTo)
+ def forward(msg: Any) =
+ ftch.forward(handler(msg))
+ def receiver =
+ ftch.receiver
+ })
+ ftch.react {
+ case any => res.set(any)
+ }
+ }
+ val a = new FutureActor[A](fun, c)
+ a.start()
+ a
}
override def !!(msg: Any): Future[Any] = {