public class CentMutex extends Process implements Lock {
// assumes that P_0 coordinates and does not request locks.
boolean haveToken;
final int leader = 0;
IntLinkedList pendingQ = new IntLinkedList();
public CentMutex(Linker initComm) {
super(initComm);
haveToken = (myId == leader);
}
public synchronized void requestCS() {
sendMsg(leader, "request");
while (!haveToken) myWait();
}
public synchronized void releaseCS() {
sendMsg(leader, "release");
haveToken = false;
}
public synchronized void handleMsg(Msg m, int src, String tag) {
if (tag.equals("request")) {
if (haveToken){
sendMsg(src, "okay");
haveToken = false;
}
else
pendingQ.add(src);
} else if (tag.equals("release")) {
if (!pendingQ.isEmpty()) {
int pid = pendingQ.removeHead();
sendMsg(pid, "okay");
} else
haveToken = true;
} else if (tag.equals("okay")) {
haveToken = true;
notify();
}
}
}