summaryrefslogtreecommitdiff
path: root/docs/examples/actors/pingpong.scala
diff options
context:
space:
mode:
Diffstat (limited to 'docs/examples/actors/pingpong.scala')
-rw-r--r--docs/examples/actors/pingpong.scala75
1 files changed, 75 insertions, 0 deletions
diff --git a/docs/examples/actors/pingpong.scala b/docs/examples/actors/pingpong.scala
new file mode 100644
index 0000000000..6ab43c5528
--- /dev/null
+++ b/docs/examples/actors/pingpong.scala
@@ -0,0 +1,75 @@
+package examples.actors
+
+import scala.actors.Actor
+import scala.actors.Actor._
+
+abstract class PingMessage
+case class MsgPingInit(count: int, pong: Actor) extends PingMessage
+case object MsgStart extends PingMessage
+case object MsgSendPing extends PingMessage
+case object MsgPong extends PingMessage
+
+abstract class PongMessage
+case object MsgPing extends PongMessage
+case object MsgStop extends PongMessage
+
+object pingpong {
+ def main(args : Array[String]) {
+ val ping = new Ping
+ ping.start
+ val pong = new Pong
+ pong.start
+ ping ! MsgPingInit(100000, pong)
+ ping ! MsgStart
+ }
+}
+
+class Ping extends Actor {
+ def act() {
+ var pingsLeft = 0
+ var pong: Actor = null
+ loop {
+ react {
+ case MsgPingInit(count, png) =>
+ Console.println("Ping: Initializing with count "+count+": "+png)
+ pingsLeft = count
+ pong = png
+ case MsgStart =>
+ Console.println("Ping: starting.")
+ pong ! MsgPing
+ pingsLeft = pingsLeft - 1
+ case MsgSendPing =>
+ pong ! MsgPing
+ pingsLeft = pingsLeft - 1
+ case MsgPong =>
+ if (pingsLeft % 100 == 0)
+ Console.println("Ping: pong from: "+sender)
+ if (pingsLeft > 0)
+ self ! MsgSendPing
+ else {
+ Console.println("Ping: Stop.")
+ pong ! MsgStop
+ exit("stop")
+ }
+ }
+ }
+ }
+}
+
+class Pong extends Actor {
+ def act() {
+ var pongCount = 0
+ loop {
+ react {
+ case MsgPing =>
+ if (pongCount % 100 == 0)
+ Console.println("Pong: ping "+pongCount+" from "+sender)
+ sender ! MsgPong
+ pongCount = pongCount + 1
+ case MsgStop =>
+ Console.println("Pong: Stop.")
+ exit("stop")
+ }
+ }
+ }
+}