class Baldo extends Process {
public static final int NCS = 0;
public static final int CS = 1;
class REQUEST extends Message {
public final int id;
public REQUEST(int id) {this.id = id;}
public String toString() {return "REQUEST, "+id;}
}
public int stato;
public final List<Integer> pending = new ArrayList<Integer>(p.length);
public boolean waiting;
public int vicino;
public void init() {
System.out.println(this + " init");
stato = NCS;
pending.clear();
waiting = false;
vicino = (id + 1) % p.length;
}
public void requestCS() {
waiting = true;
send(vicino, new REQUEST(id));
}
public void exitCS() {
waiting = false;
stato = NCS;
for(int id : pending) {
pending.remove((Object)id);
send(vicino, new REQUEST(id));
}
}
public void recv(int src, Message m) {
if(m instanceof REQUEST)
recv(src, (REQUEST)m);
}
public void recv(int src, REQUEST m) {
if(m.id == id) {
stato = CS;
System.out.println(this + " in CS!!!");
exitCS();
} else {
if(waiting == false) {
send(vicino, new REQUEST(m.id));
} else {
if(stato == NCS && m.id < id) {
send(vicino, new REQUEST(m.id));
} else {
pending.add(m.id);
}
}
}
}
}