diff options
author | Philipp Haller <hallerp@gmail.com> | 2010-05-09 18:09:17 +0000 |
---|---|---|
committer | Philipp Haller <hallerp@gmail.com> | 2010-05-09 18:09:17 +0000 |
commit | 8fe7b531649dd5f82b6ac46720c751750e893500 (patch) | |
tree | 6386d1c0b8a2d07c3f1a6467ede4667cff2b261b /src/actors/scala/actors/ActorCanReply.scala | |
parent | d1185713fa066528eac5f228aae943dd5ad3a142 (diff) | |
download | scala-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.scala | 34 |
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] = { |