splbio(9)
|
FreeBSD 一般コマンドマニュアル
|
splbio
splbio
#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