Until extends BinaryInstruction and implements preemption: execution of the left instruction, called the ``body'', is aborted when an event configuration becomes true. One says then that left is ``preempted'' by the configuration and, in this case, control goes to right which is called the ``handler''.
The preemption implemented by Until is ``weak'': left is not prevented to react at the very instant of preemption.
public class Until extends BinaryInstruction
{
private Config config;
private boolean activeHandle = false;
private boolean resumeBody = true;
public Until(Config config,Instruction body,
Instruction handler){
this.config = config; left = body; right = handler;
}
public Until(Config config,Instruction body){
this.config = config; left = body; right = new Nothing();
}
public void reset()
{
super.reset();
activeHandle = false;
resumeBody = true;
}
final public boolean equals(Instruction inst){
return super.equals(inst)
&& config.equals(((Until)inst).config);
}
final public String toString(){
if (right instanceof Nothing)
return "do "+left+" until "+config;
return "do "+left+" until "+config+" actual "+right+" end";
}
final protected byte activation(Machine machine)
{
if (activeHandle) return right.activ(machine);
if (resumeBody){ // body is to be executed
byte res = left.activ(machine); // weak preemption !
if (res != STOP) return res;
resumeBody = false;
}
if (!config.fixed(machine)) return SUSP;
if (config.evaluate(machine)){ // actual preemption
activeHandle = true;
if (machine.isEndOfInstant()) return STOP;
return right.activ(machine);
}
resumeBody = true; // to re-execute the body at next instant
return STOP;
}
}