02.2 インターバルタイマー(STIMER)

時間に関する機能には、日付と時刻の取得の他にインターバル・タイマー(間隔計時機構)があります。一定時間おきに行う処理を作る際や一定時間プログラムの実行を止める場合などに利用されます。

10秒間プログラムの実行を停止する

一定時間プログラムの実行を止めるには、STIMERサービスのWAIT機能を使います。STIMERマクロの最初の定位置パラメーターにWAITを指定し、続けて待ち合わせ時間を定義したパラメーターを指定します。サンプルでは、待ち合わせ時間を2進整数で指定しています。1/100秒単位で指定でき、1は1/100秒、100は1秒となります。STIMERマクロ発行後、OSサービスルーチン内で指定した時間が経過するまで待ち状態に入ります。指定した時間が経過するとプログラムに戻ってきます。

サンプルの処理内容は、指定した区分データセットのメンバーがISPFエディターで編集中かをENQマクロでテストします。編集中であればENQが失敗するので、その事をWTOマクロでコンソールにメッセージで通知して10秒間待ち状態に入ります。10秒経過後、再びENQをトライします。このサイクルで6回繰り返し、都合1分間リトライします。ENQに成功した場合と、リトライ回数をオーバーしたらプログラムは終了します。
ENQマクロによる排他制御が獲得できない時、一定回数リトライすることはよく行われますが、人間の操作が絡む資源の場合、単にループするよりはSTIMERマクロを組み合わせて一定時間待ってからリトライするのが一般的です。

指定した時刻になったら通知してもらう

目覚まし時計プログラムです。一定時間の経過ではなく、指定した時刻になったら起き上がるサンプルです。今度はWAITではなくREALを指定しています。REALは実時間の経過を通知する機能です。TODパラメーターは、間隔時間ではなく時刻を指定するパラメーターです。TODの代わりにLTパラメーターでもかまいません。
運用の自動化ソフトなどを使えば必要ありませんが、18:00になったらオンラインシステムを終了させる、21:00になったらバックアップのジョブを実行させるなど、決まった時刻になったら行う処理を自動化させるためには目覚まし時計が必要です。

10秒ループしたら自分で自分をキャンセルする

実時間ではなくCPU時間によるインターバルタイムの計測です。REALの代わりにTASKと指定します。間隔時間の指定方法はREALもTASKも同じです。このサンプルでは、CPUタイマー単位(約26.04166マイクロ秒)で指定しています。約10秒です。わかりにくいので、普通にBINTVLで指定してかまいません。
サンプルの処理は、一定のCPU時間を使い切ったらプログラムをABENDさせる例です。タイマーをセットしてから故意に無限ループに入ります。指定した時間のCPUを使い切ると、TIMREXITに飛び込んできます。

サンプルではタイマー出口内で大した処理をしてませんので簡単に書いてますが、出口ルーチン内からメインライン側のデータ領域などを直接参照・更新したい場合は、上記のようなハウス・キーピングをすればいいでしょう。メインライン側のベース・アドレスを同じベース・レジスターに再設定します。STIMER出口ルーチンの規約では、汎用レジスター0~12の内容はSTIMERマクロ発行時の内容とは規定されていません。マニュアル通り、GR0~12は壊れていると言う前提で再設定します。STIMERに限らず全てのマクロの出口ルーチンについて言えます。マニュアルに記載されている、出口ルーチンのレジスター規約を必ず確認してそれに従います。

STIMERで設定したタイマーは、設定時間が経過して出口で通知されると無効になります。再びタイマーによる時間測定が必要なら、改めてSTIMERマクロを発行する必要があります。STIMERマクロは必ずしもメインルーチン内で出す必要はありません。出口ルーチン内でSTIMERマクロを発行してタイマーを再設定してもかまいません。

タイマー測定のキャンセル

TTIMERマクロを使うと、一度設定したタイマーの残り時間を調べたりタイマー計測をキャンセルすることができます。サンプルでは10秒の実時間タイマーを設定してから、5命令×1千万回で計5千万回の命令を実行します。その後、TTIMERで設定したタイマーを取り消します。GR0にタイマーの残り時間がCPUタイマー形式(約26.04166マイクロ秒単位)で返されます。サンプルではタイマー出口は意味を持たないので、BR 14命令で何もせずに復帰しています。
タイマーを設定している常駐型のプログラムなどでは、オペレーター・コマンドなどによって処理を終了する時、TTIMERで不要になったタイマー設定を取り消します。TPモニターなどユーザー・アプリケーションを自分の制御で実行するようなソフトウェアでは、ユーザー・プログラム開始前にTASK指定のSTIMERでCPUタイマーを設定し、ユーザー・プログラムが終了した時点でそれを取り消したりします。

STIMERサービスは、1つのタスクで同時に複数使用することはできません。STIMERサービスによるインターバル・タイマーの設定は1つしか出来ないのです。同じタスクで複数のインターバルタイムを計測するためには、STIMERMマクロを利用します。