public class RingLeader extends Process implements Election {
int number;
int leaderId = -1;
int next;
boolean awake = false;
public RingLeader(Linker initComm, int number) {
super(initComm);
this.number = number;
next = (myId + 1) % N;
}
public synchronized int getLeader(){
while (leaderId == -1) myWait();
return leaderId;
}
public synchronized void handleMsg(Msg m, int src, String tag) {
int j = m.getMessageInt(); // get the number
if (tag.equals("election")) {
if (j > number)
sendMsg(next, "election", j); // forward the message
else if (j == number) // I won!
sendMsg(next, "leader", myId);
else if ((j < number) && !awake) startElection();
} else if (tag.equals("leader")) {
leaderId = j;
notify();
if (j != myId) sendMsg(next, "leader", j);
}
}
public synchronized void startElection() {
awake = true;
sendMsg(next, "election", number);
}
}