public class DSTerm extends Process implements TermDetector {
final static int passive = 0, active = 1;
int state = passive;
int D = 0;
int parent = -1;
boolean envtFlag;
public DSTerm(Linker initComm) {
super(initComm);
envtFlag = (myId == Symbols.coordinator);
}
public synchronized void initiate() {
}
public synchronized void handleMsg(Msg m, int src, String tag) {
if (tag.equals("signal")) {
D = D - 1;
if (D == 0) {
if (envtFlag)
System.out.println("Termination Detected");
else if (state == passive) {
sendMsg(parent, "signal");
parent = -1;
}
}
} else { // application message
state = active;
if ((parent == -1) && !envtFlag) {
parent = src;
} else
sendMsg(src, "signal");
}
}
public synchronized void sendAction() {
D = D + 1;
}
public synchronized void turnPassive() {
state = passive;
if ((D == 0) && (parent != -1)) {
sendMsg(parent, "signal");
parent = -1;
}
}
}