/* Copyright (c) 2006, Sriram Srinivasan
*
* You may distribute this software under the terms of the license
* specified in the file "License"
*/
package kilim.bench;
import kilim.Mailbox;
import kilim.Pausable;
import kilim.Task;
/*
* This code is unnecessarily long for what it aims to do: bounce a message back
* and forth between two tasks for a certain number of times. The reason for the
* length is to compare against a similar example in the scala distribution.
*/
public class PingPong {
public static void main(String[] args) {
Mailbox<Msg> pingmb = new Mailbox<Msg>();
Mailbox<Msg> pongmb = new Mailbox<Msg>();
new Ping(pingmb, pongmb).start();
new Pong(pongmb).start();
pingmb.putnb(new Msg(MsgType.Init, 100000, null));
pingmb.putnb(new Msg(MsgType.Start, pingmb));
}
}
class Ping extends Task {
Mailbox<Msg> mymb;
Mailbox<Msg> pongmb;
int origcount;
int count;
long beginTime;
Ping(Mailbox<Msg> mb, Mailbox<Msg> pong) {
mymb = mb;
pongmb = pong;
}
public void execute() throws Pausable {
while (true) {
Msg m = mymb.get();
switch(m.type) {
case Init:
origcount = count = m.count;
beginTime = System.currentTimeMillis();
break;
case Start:
case PongMsg:
if (count > 0) {
// System.out.println("Ping: " + m + " " + count); System.out.flush();
// pongmb.put(new Msg(MsgType.PingMsg, mymb));
m.type = MsgType.PingMsg;
pongmb.put(m);
count--;
} else {
long elapsed = System.currentTimeMillis() - beginTime;
System.out.println("Total time: " + elapsed + " millis, "
+ origcount + " rounds");
System.out.println("Time to send msg + context switch: " +
(elapsed * 1000.0 / 2 / origcount) + " micros");
System.exit(0);
}
break;
}
}
}
}
class Pong extends Task {
Mailbox<Msg> mymb;
Pong(Mailbox<Msg> mb) {
mymb = mb;
}
public void execute() throws Pausable {
while (true) {
Msg m = mymb.get();
// System.out.println("Pong: " + m); System.out.flush();
switch(m.type) {
case PingMsg:
// m.mb.put(new Msg(MsgType.PongMsg, null));
m.type = MsgType.PongMsg;
m.mb.put(m);
break;
}
}
}
}
enum MsgType {Init, Start, PingMsg, PongMsg};
class Msg {
MsgType type;
Mailbox<Msg> mb;
int count; // for init
Msg(MsgType t, int c, Mailbox<Msg> amb) {type = t; mb = amb; count = c;}
Msg(MsgType t, Mailbox<Msg> amb) {type = t; mb = amb;}
public String toString() {
return "" + System.identityHashCode(this) + " " + type;
}
}