import java.util.*; public class CentMutex extends Process implements Lock { // assumes that P_0 coordinates and does not request locks. boolean haveToken; final int leader = 0; LinkedList<Integer> pendingQ = new LinkedList<Integer>(); public CentMutex(MsgHandler 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.removeFirst(); sendMsg(pid, "okay"); } else haveToken = true; } else if (tag.equals("okay")) haveToken = true; } }