import java.util.*; public class TermToken extends Process implements TermDetector { final static int passive = 0, active = 1, white = 0, black = 1; int state = passive, color = white; int c = 0; int next; boolean haveToken = false; int tokenCount = 0, tokenColor = white; public TermToken(Linker initComm) { super(initComm); next = (myId + 1) % N; } public void initiate() { if (myId==Symbols.coordinator) { if (state == passive) sendToken(); else haveToken = true; } } public synchronized void handleMsg(Message m, int source, String tag) { if (tag.equals("termToken")) { haveToken = true; StringTokenizer st = new StringTokenizer(m.getMessage()); tokenColor = Integer.parseInt(st.nextToken()); tokenCount = Integer.parseInt(st.nextToken()); if (myId==Symbols.coordinator) { if ((c + tokenCount == 0) && (color == white) && (state == passive) && (tokenColor == white)) { System.out.println("Termination Detected"); haveToken = false; } } if ((state == passive) && haveToken) sendToken(); } else { // application message state = active; color = black; c = c - 1; } } public void sendAction() { c = c + 1; } public void turnPassive() { state = passive; if (haveToken) sendToken(); } synchronized void sendToken() { if (myId==Symbols.coordinator) sendMsg(next, "termToken", white, 0); else if ((color == black) || (tokenColor == black)) sendMsg(next, "termToken", black, c + tokenCount); else sendMsg(next, "termToken", white, c + tokenCount); haveToken = false; color = white; } }