summaryrefslogtreecommitdiff
path: root/docs/examples/pilib/handover.scala
diff options
context:
space:
mode:
Diffstat (limited to 'docs/examples/pilib/handover.scala')
-rw-r--r--docs/examples/pilib/handover.scala190
1 files changed, 190 insertions, 0 deletions
diff --git a/docs/examples/pilib/handover.scala b/docs/examples/pilib/handover.scala
new file mode 100644
index 0000000000..85fb899555
--- /dev/null
+++ b/docs/examples/pilib/handover.scala
@@ -0,0 +1,190 @@
+package examples.pilib;
+
+/**
+* Handover example with recursive types for channels.
+*/
+object handoverRecursive {
+
+ import concurrent.pilib._;
+
+ val random = new java.util.Random();
+
+ /**
+ * Recursive type for channels that carry a channel "unit" and
+ * an object of the type we define.
+ */
+ class Switch extends Chan[Pair[Chan[unit], Switch]];
+
+ /**
+ * Car.
+ */
+ def Car(talk: Chan[unit], switch: Switch): unit =
+ choice (
+ switch * ({ case Pair(t,s) => Car(t, s) }),
+ talk(()) * ( {
+ Thread.sleep(1 + random.nextInt(1000));
+ System.out.println("Car emitted a message.");
+ Car(talk, switch)
+ })
+ );
+
+ /**
+ * Control center.
+ */
+ def Control(talk1: Chan[unit], switch1: Switch,
+ gain1: Switch, lose1: Switch,
+ talk2: Chan[unit], switch2: Switch,
+ gain2: Switch, lose2: Switch): unit
+ = {
+ def Control1: unit= {
+ Thread.sleep(1 + random.nextInt(1000));
+ lose1.write(Pair(talk2, switch2));
+ gain2.write(Pair(talk2, switch2));
+ Control2;
+ }
+ def Control2: unit = {
+ Thread.sleep(1 + random.nextInt(1000));
+ lose2.write(Pair(talk1, switch1));
+ gain1.write(Pair(talk1, switch1));
+ Control1;
+ }
+ Control1;
+ }
+
+ /**
+ * Active transmitter.
+ */
+ def ActiveTransmitter(id: String, talk: Chan[unit], switch: Switch,
+ gain: Switch, lose: Switch): unit
+ =
+ choice (
+ talk * (x => {
+ System.out.println(id + " received a message.");
+ ActiveTransmitter(id, talk, switch, gain, lose)
+ }),
+ lose * ({ case Pair(t, s) => {
+ switch.write(Pair(t, s));
+ IdleTransmitter(id, gain, lose)
+ }})
+ );
+
+ /**
+ * Idle transmitter.
+ */
+ def IdleTransmitter(id: String, gain: Switch, lose: Switch): unit = {
+ val Pair(t, s) = gain.read;
+ ActiveTransmitter(id, t, s, gain, lose)
+ }
+
+ def main(args: Array[String]): unit = {
+ val talk1 = new Chan[unit];
+ val switch1 = new Switch;
+ val gain1 = new Switch;
+ val lose1 = new Switch;
+ val talk2 = new Chan[unit];
+ val switch2 = new Switch;
+ val gain2 = new Switch;
+ val lose2 = new Switch;
+ spawn <
+ Car(talk1, switch1) |
+ ActiveTransmitter("Transmitter 1", talk1, switch1, gain1, lose1) |
+ IdleTransmitter("Transmitter 2", gain2, lose2) |
+ Control(talk1, switch1, gain1, lose1, talk2, switch2, gain2, lose2)
+ >
+ }
+}
+
+/**
+* Handover example with type casts.
+*/
+object handoverCast {
+
+ import concurrent.pilib._;
+
+ val random = new java.util.Random();
+
+ /**
+ * Car.
+ */
+ def Car(talk: Chan[Any], switch: Chan[Any]): unit =
+ choice (
+ switch * (o => {
+ val Pair(t,s) = o.asInstanceOf[Pair[Chan[Any],Chan[Any]]];
+ Car(t, s)
+ }),
+ talk(()) * ( {
+ Thread.sleep(1 + random.nextInt(1000));
+ System.out.println("Car emitted a message.");
+ Car(talk, switch)
+ })
+ );
+
+ /**
+ * Control center.
+ */
+ def Control(talk1: Chan[Any], switch1: Chan[Any],
+ gain1: Chan[Any], lose1: Chan[Any],
+ talk2: Chan[Any], switch2: Chan[Any],
+ gain2: Chan[Any], lose2: Chan[Any]): unit
+ = {
+ def Control1: unit= {
+ Thread.sleep(1 + random.nextInt(1000));
+ lose1.write(Pair(talk2, switch2));
+ gain2.write(Pair(talk2, switch2));
+ Control2
+ }
+ def Control2: unit = {
+ Thread.sleep(1 + random.nextInt(1000));
+ lose2.write(Pair(talk1, switch1));
+ gain1.write(Pair(talk1, switch1));
+ Control1
+ }
+ Control1
+ }
+
+ /**
+ * Active transmitter.
+ */
+ def ActiveTransmitter(id: String, talk: Chan[Any], switch: Chan[Any],
+ gain: Chan[Any], lose: Chan[Any]): unit
+ =
+ choice (
+ talk * (x => {
+ System.out.println(id + " received a message.");
+ ActiveTransmitter(id, talk, switch, gain, lose)
+ }),
+ lose * (o => {
+ val Pair(t, s) = o.asInstanceOf[Pair[Chan[Any],Chan[Any]]];
+ switch.write(Pair(t, s));
+ IdleTransmitter(id, gain, lose)
+ })
+ );
+
+ /**
+ * Idle transmitter.
+ */
+ def IdleTransmitter(id: String, gain: Chan[Any], lose: Chan[Any]): unit = {
+ val Pair(t, s) = gain.read.asInstanceOf[Pair[Chan[Any],Chan[Any]]];
+ ActiveTransmitter(id, t, s, gain, lose)
+ }
+
+ def main(args: Array[String]): unit = {
+ val talk1 = new Chan[Any];
+ val switch1 = new Chan[Any];
+ val gain1 = new Chan[Any];
+ val lose1 = new Chan[Any];
+ val talk2 = new Chan[Any];
+ val switch2 = new Chan[Any];
+ val gain2 = new Chan[Any];
+ val lose2 = new Chan[Any];
+ spawn <
+ Car(talk1, switch1) |
+ ActiveTransmitter("Transmitter 1", talk1, switch1, gain1, lose1) |
+ IdleTransmitter("Transmitter 2", gain2, lose2) |
+ Control(talk1, switch1, gain1, lose1, talk2, switch2, gain2, lose2)
+ >
+ }
+
+}
+
+