public class SpanTree extends Process { public int parent = -1; // no parent yet public IntLinkedList children = new IntLinkedList(); int numReports = 0; boolean done = false; public SpanTree(Linker initComm, boolean isRoot) { super(initComm); if (isRoot) { parent = myId; if (initComm.neighbors.size() == 0) done = true; else sendToNeighbors( "invite", myId); } } public void waitForDone() { // block till children known while (!done) myWait(); } public synchronized void handleMsg(Message m, int source, String tag) { if (tag.equals("invite")) { if (parent == -1) { numReports++; parent = source; sendMsg(source, "accept"); Util.println("Sending accept"); for (int i = 0; i < N; i++) if ((i != myId) && (i != source) && isNeighbor(i)) sendMsg(i, "invite"); } else sendMsg(source, "reject"); } else if ((tag.equals("accept")) || (tag.equals("reject"))) { if (tag.equals("accept")) children.add(source); numReports++; if (numReports == comm.neighbors.size()) { done = true; notify(); } } } }