import java.util.*; public class SenderCamera extends Process implements Camera { static final int white = 0, red = 1; public int myColor = white; CamUser app; boolean closed[]; MsgList outChan[] = null; public SenderCamera(CameraLinker initComm, CamUser app) { super(initComm); this.app = app; closed = new boolean[N]; outChan = new MsgList[N]; for (int i = 0; i < N; i++) if (isNeighbor(i)) { closed[i] = false; outChan[i] = new MsgList(); } else closed[i] = true; initComm.initCam(this); } public void globalState() { myColor = red; app.localState(); // record local State; sendToNeighbors("marker", myId); // send Markers } public synchronized void handleMsg(Message m, int source, String tag) { if (tag.equals("marker")) { if (myColor == white) globalState(); closed[source] = true; checkDone(); } else if (tag.equals("ack")) { int seqNo = m.getMessageInt(); outChan[source].removeM(seqNo); } else { // application message StringTokenizer st = new StringTokenizer(m.getMessage() + "#"); int seqNo = Integer.parseInt(st.nextToken()); Message appMsg = Message.parseMsg(st); if ((myColor==white)&& (tag.equals("white"))) sendMsg(source, "ack", seqNo); if ((myColor==white)&& (tag.equals("red"))) globalState(); app.handleMsg(appMsg, source, appMsg.getTag()); } } void checkDone() { boolean done = true; if (myColor == white) done = false; for (int i = 0; i < N; i++) if (closed[i] == false) done = false; } public void recordMessage(int destId, SeqMessage sm){ outChan[destId].add(sm); } }