public class TwoPhaseParticipant extends Process { boolean localCommit; boolean globalCommit; boolean done = false; boolean hasProposed = false; public TwoPhaseParticipant(Linker initComm) { super(initComm); } public synchronized void propose(boolean vote) { localCommit = vote; hasProposed = true; notify(); } public synchronized boolean decide() { while (!done) myWait(); return globalCommit; } public synchronized void handleMsg(Msg m, int src, String tag) { while (!hasProposed) myWait(); if (tag.equals("request")) { if (localCommit) sendMsg(src, "yes"); else sendMsg(src, "no"); } else if (tag.equals("finalCommit")) { globalCommit = true; done = true; notify(); } else if (tag.equals("finalAbort")) { globalCommit = false; done = true; notify(); } } }