splx(9) FreeBSD 一般コマンドマニュアル

splx

前のページ 上に戻る 次のページ

splx


     #include <sys/types.h>
     #include <sys/systm.h>

     intrmask_t
     splbio(void);

     intrmask_t
     splclock(void);

     intrmask_t
     splhigh(void);

     intrmask_t
     splimp(void);

     intrmask_t
     splnet(void);

     intrmask_t
     splsoftclock(void);

     intrmask_t
     splsofttty(void);

     intrmask_t
     splstatclock(void);

     intrmask_t
     spltty(void);

     void
     spl0(void);

     void
     splx(intrmask_t ipl);


解説

     spl() 関数ファミリは CPU の割り込み優先度の ``レベル'' を設定します。これ
     はブロックされた優先度レベルの割り込みハンドラの実行を抑制します。割り込
     みハンドラによって調査あるいは修正されたであろうデータ領域を調査あるいは
     修正するドライバの ``synchronous'' 部分(ユーザープロセスを代表して実行さ
     れる部分)で使用されます。

     通常それぞれの割り込みを使用するドライバは、 config ファイルのキーワード
     によって 1 つの割り込み優先度グループに割り当てられます。例えば、

           device foo0 at isa? port 0x0815 irq 12 tty

     は、割り込み 12 を ``tty'' 優先度グループに割り当てます。システムは自動的
     に xxx グループの割り込みを優先度が splxxx () 以上の時に呼ばれるように準
     備します。


     spltty()          基本的にはネットワーク以外の通信デバイスですが、事実上
                       はネットワークとディスク以外の全てのドライバ。


戻り値

     splx() および spl0() 以外の全ての関数は、操作前の優先度の値を返します。


使用例

     以下は、標準的な使用例です。

     struct foo_softc {
             ...
             int flags;
     #define FOO_ASLEEP      1
     #define FOO_READY       2

     } foo_softc[NFOO];

     int
     foowrite(...)
     {
             struct foo_softc *sc;
             int s, error;

             ...
             s = spltty();
             if (!(sc->flags & FOO_READY)) {
                     /* 準備ができていません、待機しなければなりません */
                     sc->flags |= FOO_ASLEEP;
                     error = tsleep(sc, PZERO, "foordy", 0);
                     sc->flags &= ~FOO_ASLEEP;
             }
             sc->flags &= ~FOO_READY;
             splx(s);

             ...
     }

     void
     foointr(...)
     {
             struct foo_softc *sc;

             ...
             sc->flags |= FOO_READY;
             if (sc->flags & FOO_ASLEEP)
                     /* 誰かが我々を待っています、起こしてください */
                     wakeup(sc);
             ...
     }

     割り込みハンドラは 絶対に優先度レベルを減少させるべきではない、ということ
     このマニュアルページは Jorg Wunsch が書きました。

FreeBSD 4.4                      July 21, 1996                     FreeBSD 4.4

ABELNET VPSサービス