File: boundedbuffer.scala

package info (click to toggle)
scala 2.9.2%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 67,252 kB
  • ctags: 6,602
  • sloc: java: 27,488; xml: 4,412; python: 2,297; sh: 734; makefile: 16; ansic: 6
file content (37 lines) | stat: -rw-r--r-- 889 bytes parent folder | download | duplicates (2)
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
package examples.actors

import scala.actors.Actor._

object boundedbuffer {
  class BoundedBuffer[T](N: Int)(implicit m: Manifest[T]) {
    private case class Put(x: T)
    private case object Get
    private case object Stop

    private val buffer = actor {
      val buf = new Array[T](N)
      var in, out, n = 0
      loop {
        react {
          case Put(x) if n < N =>
            buf(in) = x; in = (in + 1) % N; n += 1; reply()
          case Get if n > 0 =>
            val r = buf(out); out = (out + 1) % N; n -= 1; reply(r)
          case Stop =>
            reply(); exit("stopped")
        }
      }
    }

    def put(x: T) { buffer !? Put(x) }
    def get: T = (buffer !? Get).asInstanceOf[T]
    def stop() { buffer !? Stop }
  }

  def main(args: Array[String]) {
    val buf = new BoundedBuffer[Int](1)
    buf.put(42)
    println("" + buf.get)
    buf.stop()
  }
}