同期・非同期モードとイベント

久々にVOSの話でも。

Stratus VOSのI/O動作には同期モードと非同期モードがあります。ファイルを読み書きするときは通常デフォルトの同期モードで行われ、オペレーションが完了すればI/O動作も終わってる状態となります。短時間で処理される動作なら同期モードでも支障ありませんが、通信などでいつ読み込まれるかわからない場合では同期モードでは処理が止まってしまいます。
例えば、内部的なコマンドを受け付け処理と外部からのデータ受信処理を行うプログラムを作る場合、2つの事象(イベント)を同時に処理する必要があります。これが行われてないと、外部データを読み込みしてる間に内部コマンドが届いても処理できなくて困ってしまいます。そこで登場するのが非同期モードです。
非同期モードは通信やキューなどのプロセス間通信で使用されます。ファイルI/Oでも使用できますが逆に処理が煩雑になります。読み取りで威力を発揮し、読み取り動作を行うとデータがあればデータを戻し、無い場合は受信のイベントを待てという指示としてe$caller_must_waitというエラーコード(実コードは1277)を戻します。そしてプログラムは受信などの動作が完了時に通知されるイベント通知をもって処理再開を行います。イベントを待つのにs$wait_eventというAPIを使用し、処理が完了するとイベント通知されたかわかるという仕組みです。上記の例のプログラムだと、内部コマンドを受け取るイベントと外部データを受け取るイベントの2つを待ち、発生したイベントを判断してそれぞれの処理を行えばいいわけです。これで外部データ受信待ち中に内部コマンドでプログラム停止命令などを受けると正常に終了させられたりできるわけです。
VOSではポートを介して一貫したイベント処理とI/O処理を提供してくれるので、あらゆるI/O動作を簡単に処理できます。これが通信に強いとされる根幹です。