procedure Add is I:Natural:=0; begin; select delay 1.0; then abort loop I:=I+1; end loop; end select; end Add;
で良いのかと思ってたら、実行時に無限ループに。
でも、
procedure Add is I:Natural:=0; begin; select delay 1.0; then abort loop I:=I+1; delay 0.0; end loop; end select; end Add;
こっちは期待通りに動く……。
何故だ……?
というかこれだと、ARM 9.7.4 Asynchronous Transfer of Controlのサンプルが動かないんじゃないだろうか……。
…とか思ってたら、先人の素晴らしい記事を発見。
というわけで、
procedure Add is I:Natural:=0; begin; select delay 1.0; then abort loop begin pragma Abort_Defer; I:=I+1; end; end loop; end select; end Add;
こんな感じにしてみたけど、、、わざわざbegin..endで囲まなければならない上に、吐くアセンブリがdelay使った時より大きいような……。
delay使った方が良いかな……。