summaryrefslogtreecommitdiff
path: root/docs/examples/actors/pingpong.scala
blob: 6ab43c5528aa9fec9b2fc695f506d166cd7dbd0e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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")
      }
    }
  }
}