import java.util.*; public class RAMutex extends Process implements Lock { public int myts; public LamportClock c = new LamportClock(); LinkedList<Integer> pendingQ = new LinkedList<Integer>(); public int numOkay = 0; public RAMutex(MsgHandler initComm) { super(initComm); myts = Integer.MAX_VALUE; } public synchronized void requestCS() { c.tick(); myts = c.getValue(); sendMsg(neighbors,"request", myts); numOkay = 0; while (numOkay < n-1) myWait(); } public synchronized void releaseCS() { myts = Integer.MAX_VALUE; while (!pendingQ.isEmpty()) sendMsg(pendingQ.remove(), "okay", c.getValue()); } public Boolean okayCS() { if(myts == Integer.MAX_VALUE || numOkay <n-1) return false; return true; } public synchronized void handleMsg(Msg m, int src, String tag) { int timeStamp = m.getMessageInt(); c.receiveAction(src, timeStamp); if (tag.equals("request")) { if ((timeStamp < myts) || ((timeStamp == myts) && (src < myId))) sendMsg(src, "okay", c.getValue()); else pendingQ.add(src); } else if (tag.equals("okay")) numOkay++; } }