externalThe external keyword specifies that communication over a
requires port may experience a delay. This may for instance be
caused by the switch between execution contexts as in inter-process
communication or the use of threads.
requires external itimer t;
During verification the delay on an external interface is
experienced an additional interleaving of events that would otherwise
not occur.
Component remote_timer_proxy illustrates how a delayed
communication channel may cause a race condition leading to illegal
behavior.
The implementation of component remote_timer_proxy is correct (no
illegal behavior) for requires itimer rp but incorrect for
requires external itimer rp due to race between pp.cancel
and rp.timeout.
extern double $double$;
interface itimer
{
in void create (double seconds);
in void cancel ();
out void timeout ();
behavior
{
bool is_armed = false;
[!is_armed] on create: is_armed = true;
on cancel: is_armed = false;
[is_armed] on inevitable: {timeout; is_armed = false;}
}
}
component remote_timer_proxy
{
provides itimer pp;
requires external itimer rp;
behavior
{
bool is_armed = false;
on pp.create (s):
[!is_armed] {rp.create (s); is_armed = true;}
on pp.cancel (): {rp.cancel (); is_armed = false;}
on rp.timeout ():
[is_armed] {pp.timeout (); is_armed = false;}
}
}