LOCK(9) FreeBSD カーネル開発者マニュアル LOCK(9)
名称
lockinit, lockdestroy, lockcount, lockmgr, lockstatus, lockmgr_printinfo − lockmgr ファミリの関数 |
書式
#include <sys/types.h> void |
lockinit(struct lock *lkp, int prio, const char *wmesg, int timo, int flags); void |
lockdestroy(struct lock *lkp); int |
lockcount(struct lock *lkp); int |
lockmgr(struct lock *lkp, u_int flags, struct mtx *interlkp, struct thread *td); int |
lockstatus(struct lock *lkp, struct thread *td); void |
lockmgr_printinfo(struct lock *lkp); |
解説 |
lockinit() 関数はロックを初期化するために使用されます。これはロックに関す る実行されることが可能なあらゆる操作の前に、呼び出されなければなりませ ん。引数は以下の通りです。 |
lkp
初期化されるべきロックへのポインタです。 prio wmesg timo flags LK_NOWAIT LK_SLEEPFAIL LK_CANRECURSE LK_REENABLE LK_NOPAUSE LK_TIMELOCK lockdestroy() 関数はロックを破壊するために使用され、カーネル内のいくつか の場所で呼び出されますが、現在は何もしません。 lockcount() 関数はロック lkp に対する排他ロックと共有ロックのカウント数を 返します。 lockmgr() 関数は共有ロックと排他ロックおよび再帰のサポートを含む、カーネ ル内部の一般的なロック機能を取り扱います。 lockmgr() はロックのアップグ レードとダウングレードも可能です。 引数は以下の通りです。 lkp flags LK_SHARED LK_EXCLUSIVE LK_DOWNGRADE LK_EXCLUPGRADE LK_UPGRADE LK_RELEASE LK_DRAIN LK_SLEEPFAIL LK_NOWAIT LK_CANRECURSE LK_INTERLOCK interlkp td lockstatus() 関数は渡された thread に関するロックの状態を返します。 td が NULL で排他ロックが保持されている場合には、 LK_EXCLUSIVE が返されます。 lockmgr_printinfo() 関数はロックについてのデバッグ情報を出力します。これ は主に VOP_PRINT(9) 関数によって使用されます。 戻り値 |
lockcount() 関数は 0 以上の整数を返します。 lockmgr() 関数は成功時には 0 を、失敗時には 0 ではない値を返します。 lockstatus() 関数は以下の値を返します。 |
LK_EXCLUSIVE
スレッド td によって排他ロックが保持されています。 LK_EXCLOTHER LK_SHARED 0 エラー |
lockmgr() は次の場合に失敗します。 |
[EBUSY]
LK_FORCEUPGRADE が要求されて、ほかのスレッドが既にロッ クのアップグレードを要求しています。 [EBUSY] [ENOLCK] [EINTR] [ERESTART] [EWOULDBLOCK] ロック |
lockmgr() への flags 引数に LK_INTERLOCK が渡された場合には、 interlkp は lockmgr() を呼び出すために以前に保持されていなければならず、ロック解除さ れて返されます。 失敗するアップグレードの試みは、現在保持しているロックを失わせる結果にな ります。また、排他ロックのアップグレードは無効で、試行の結果として panic(9) を引き起こします。 |
関連項目
msleep(9), mtx_assert(9), panic(9), VOP_PRINT(9) |
作者
このマニュアルページは Chad David 〈davidc@acns.ab.ca〉 が書きました。 FreeBSD 10.0 July 9, 2001 FreeBSD 10.0 |