Oracle® Solaris 11.2 デバイスドライバの記述

印刷ビューの終了

更新: 2014 年 9 月
 
 

cv_wait() および cv_timedwait() 関数

cv_wait(9F) によってスレッドが条件でブロックされ、その条件が発生しない場合、スレッドは待機し続けることになります。その状況を避けるには、別のスレッドに依存して復帰処理を実行する cv_timedwait(9F) を使用します。cv_timedwait() は絶対待ち時間を引数に取ります。 指定された時間に達してもイベントが発生しなかった場合、cv_timedwait()-1 を返します。条件が満たされた場合、cv_timedwait() は正の値を返します。

cv_timedwait(9F) には、システムが最後にリブートしてからのクロック刻みで表した絶対待ち時間を指定する必要があります。待ち時間は、ddi_get_lbolt(9F) で現在の値を取得することによって調べることができます。ドライバは通常、最大待ち時間の値を秒またはマイクロ秒単位で保持しているため、drv_usectohz(9F) によってこの値がクロック刻みに変換され、ddi_get_lbolt(9F) で得られた値に加算されます。

次の例は、呼び出し元に EIO を返す前に、cv_timedwait(9F) を使用してデバイスアクセスを最大 5 秒待機する方法を示しています。

使用例 3-2  cv_timedwait() の使用
clock_t            cur_ticks, to;
mutex_enter(&xsp->mu);
while (xsp->busy) {
        cur_ticks = ddi_get_lbolt();
        to = cur_ticks + drv_usectohz(5000000); /* 5 seconds from now */
        if (cv_timedwait(&xsp->cv, &xsp->mu, to) == -1) {
                /*
                 * The timeout time 'to' was reached without the
                 * condition being signaled.
                 */
                /* tidy up and exit */
                mutex_exit(&xsp->mu);
                return (EIO);
        }
}
xsp->busy = 1;
mutex_exit(&xsp->mu);

デバイスドライバの書き込み処理では通常、cv_wait(9F) よりも cv_timedwait(9F) を優先的に使用しますが、cv_wait(9F) を使用するほうが望ましい場合があります。たとえば、ドライバが次のような条件で待機している場合は、cv_wait(9F) のほうが適しています。

  • 内部ドライバ状態の変更。このような状態変更が発生するには、何らかのコマンドの実行または一定時間の経過が必要な場合があります。

  • ドライバでシングルスレッド処理する必要がある何らかの要素

  • タイムアウトの可能性をすでに管理している何らかの状況。「A」が「B」に依存しており、「B」が cv_timedwait(9F) を使用している場合などです。