import java.util.*;
public class Consensus extends Process {
    int myValue;
    int f; // maximum number of faults
    boolean changed = true;
    boolean hasProposed = false;
    public Consensus(Linker initComm, int f) {
        super(initComm);
        this.f = f;
    }
    public synchronized void propose(int value) {
        myValue = value;
        hasProposed = true;
        notify();
    }
    public int decide() {
        for (int k = 0; k <= f; k++) { // f+1 rounds
            synchronized (this) {
                if (changed) broadcastMsg("proposal", myValue);
            }
            // sleep enough to receive messages for this round
            Util.mySleep(Symbols.roundTime);
        }
        synchronized (this) {
            return myValue;
        }
    }
    public synchronized void handleMsg(Msg m, int src, String tag) {
        while (!hasProposed) myWait();
        if (tag.equals("proposal")) {
            int value = m.getMessageInt();
            if (value < myValue) {
                myValue = value;
                changed = true;
            } else
                changed = false;
        }
    }
}