import java.util.Timer;
public class CircToken extends Process implements Lock {
boolean haveToken;
boolean wantCS = false;
public CircToken(Linker initComm, int coordinator) {
super(initComm);
haveToken = (myId == coordinator);
}
public synchronized void initiate() {
if (haveToken) sendToken();
}
public synchronized void requestCS() {
wantCS = true;
while (!haveToken) myWait();
}
public synchronized void releaseCS() {
wantCS = false;
sendToken();
}
void sendToken() {
if (haveToken && !wantCS) {
int next = (myId + 1) % N;
Util.println("Process " + myId + "has sent the token");
sendMsg(next, "token");
haveToken = false;
}
}
public synchronized void handleMsg(Msg m, int src, String tag) {
if (tag.equals("token")) {
haveToken = true;
if (wantCS)
notify();
else {
Util.mySleep(1000);
sendToken();
}
}
}
}