import java.util.*;
public class KingBGA extends Process {
final static int defaultValue = 0;
int f; // maximum number of faults
int V[]; // set of values known
int kingValue, myValue;
public KingBGA(Linker initComm, int f) {
super(initComm);
this.f = f;
V = new int[N];
}
public synchronized void propose(int val) {
for (int i = 0; i < N; i++) V[i] = defaultValue;
V[myId] = val;
}
public int decide() {
for (int k = 0; k <= f; k++) { // f+1 rounds
broadcastMsg("phase1", V[myId]);
Util.mySleep(Symbols.roundTime);
synchronized (this) {
myValue = getMajority(V);
if (k == myId)
broadcastMsg("king", myValue);
}
Util.mySleep(Symbols.roundTime);
synchronized (this) {
if (numCopies(V, myValue) > N / 2 + f)
V[myId] = myValue;
else
V[myId] = kingValue;
}
}
return V[myId];
}
public synchronized void handleMsg(Msg m, int src, String tag) {
if (tag.equals("phase1")) {
V[src] = m.getMessageInt();
} else if (tag.equals("king")) {
kingValue = m.getMessageInt();
}
}
int getMajority(int V[]) {
if (numCopies(V, 0) > N / 2)
return 0;
else if (numCopies(V, 1) > N / 2)
return 1;
else
return defaultValue;
}
int numCopies(int V[], int v) {
int count = 0;
for (int i = 0; i < V.length; i++)
if (V[i] == v) count++;
return count;
}
}