import java.util.LinkedList;
public class SimpleSynch extends Process implements Synchronizer {
int pulse = 0;
MsgHandler prog;
boolean rcvEnabled [];
IntLinkedList pendingS = new IntLinkedList();
IntLinkedList pendingR = new IntLinkedList();
public SimpleSynch(Linker initComm) {
super(initComm);
rcvEnabled = new boolean[N];
for (int i = 0; i < N; i++)
rcvEnabled[i] = false;
}
public synchronized void initialize(MsgHandler initProg) {
prog = initProg;
pendingS.addAll(comm.neighbors);
notifyAll();
}
public synchronized void handleMsg(Msg m, int src, String tag) {
while (!rcvEnabled[src]) myWait();
pendingR.removeObject(src);
if (pendingR.isEmpty()) notifyAll();
if (!tag.equals("synchNull"))
prog.handleMsg(m, src, tag);
rcvEnabled[src] = false;
}
public synchronized void sendMessage(int destId, String tag, int msg) {
if (pendingS.contains(destId)) {
pendingS.removeObject(destId);
sendMsg(destId, tag, msg);
} else
System.err.println("Error: sending two messages/pulse");
}
public synchronized void nextPulse() {
while (!pendingS.isEmpty()) { // finish last pulse by sending null
int dest = pendingS.removeHead();
sendMsg(dest, "synchNull", 0);
}
pulse ++;
Util.println("**** new pulse ****:" + pulse);
pendingS.addAll(comm.neighbors);
pendingR.addAll(comm.neighbors);
for (int i = 0; i < N; i++)
rcvEnabled[i] = true;
notifyAll();
while (!pendingR.isEmpty()) myWait();
}
}