IBLCK

NI-488.2

IBLCK

ボードレベル


目的

現在のプロセスのインタフェースに対する排他的ロックを取得または解放します。

形式

C

unsigned long iblck (int ud, int v, unsigned int LockWaitTime, void * Reserved)

Visual Basic

CALL iblck (ud%, v%, LockWaitTime&)

または

status% = illck (ud%, v%, LockWaitTime&)

対話式制御(使用に関する注意)

iblck v LockWaitTime

入力

ud ボードユニットデスクリプタまたはボード指標デスクリプタ
v インタフェースに対するロックの取得・解放を示します
LockWaitTime ELCKエラーを返す前の排他的ロックの有効期限(ミリ秒)
Reserved 今後の使用のために予約(現バージョンではNULLのみ有効)

出力

関数からの戻り値 Ibstaの値

説明

vが1の場合、ドライバは現在のプロセスに対してインタフェースへの排他的ロックを取得します。LockWaitTimeで指定されたタイムアウトの期間内にロックが取得されない場合、コールは失敗しELCKエラーを返します(IbstaにはERRIberrにはELCKを設定)。

vが0の場合、現在のプロセスが以前に取得したロックを解放します。インタフェースロックはそのロックを取得したプロセスのみが解放できます。vがゼロでプロセスにロックがない場合、コールは失敗し、ELCKを返します。iblckをコールしてインタフェースに対するロックを解放する際、LockWaitTimeは無視されます。

あるプロセスがロックの取得に成功した場合、そのプロセスによる、そのインタフェースに対するすべてのGPIBコールは、正常に動作します。

プロセスがロックの取得に成功した場合、そのインタフェースの別のプロセスによるGPIBコール(iblckとボードレベルのibfindを除く)はすべて、直ちにELCKで失敗します。他のプロセスによるiblckコールは、ロックの取得を試みますが、タイムアウト時間が経過後のみ、コールはELCKで失敗します。ボードレベルでのibfindコールはELCKエラーを返しますが、有効なユニットデスクリプタを返します。

インタフェースのロックは、排他性がありプロセス間での共有はできません。あるプロセスがロックの取得に成功した場合、他のプロセスはそのインタフェースへのロックを取得することはできません。

プロセスは、1つのインタフェースに対し、複数の(重複した)ロックを取得することができます。ドライバはインタフェースごとの有効なロック数のリファレンスカウントを保持し、リファレンスカウントが0になるまではインタフェースのロックを解除しません。iblckコールが成功した場合、つまり、ERRIbstaに設定されない場合には、v値とは無関係に、Ibcntにはudに対して影響を持つ残りのロックの数が含まれます。

インタフェースへのロックは、プロセスとGPIBインタフェースに関連付けられています。取得されたロックは、ロックが解放されるまで有効です。iblckをコールし、ロックを複数回取得した場合、そのロック数と同じ回数のロック解放コールが必要です。ibonl (0または1)を呼び出すと、udで指定されたインタフェースのプロセスでのすべてのインタフェースロックが解除されます。

LockWaitTimeが0の場合、待機時間が0msであることを示します。他のプロセスがインタフェースをロックしている場合、iblckは直ちにELCKエラーを返します。エラーを返さない場合、そのプロセスはロックを取得して戻ります。

発生する可能性のあるエラー

EARG vは0または1ではないか、ReservedNULLではありません。
ECAP udのロックリファレンスカウントが最大に達したため、要求されたロックを取得できません。
EDVR NI-488.2ドライバの構成またはインストールが正しくありません。
EHDL udが無効または範囲外です。
ELCK 別プロセスがそのインタフェースをロックがしているため、要求したロックをタイムアウト期間内で取得できません。または、プロセスにはudに対するロックがないため、ロックを解放できません。
ENEB インタフェースが取り付けられていないか、正しく構成されていません。
EOIP 非同期I/Oの処理中です。