VOP_LOCK(9) FreeBSD カーネル開発者マニュアル VOP_LOCK(9)
名称
VOP_LOCK, VOP_UNLOCK, VOP_ISLOCKED, vn_lock − vnode アクセスの直列化 |
書式
#include <sys/param.h> int |
VOP_LOCK(struct vnode *vp, int flags, struct thread *td); int |
VOP_UNLOCK(struct vnode *vp, int flags, struct thread *td); int |
VOP_ISLOCKED(struct vnode *vp, struct thread *td); int |
vn_lock(struct vnode *vp, int flags, struct thread *td); |
解説 |
これらの呼び出しは、ファイルシステムへのアクセスを直列化するために使用さ れます。例えば、同一ファイルに対する 2 つの書き込みが同時に発生することを 避けるために使用します。 引数は以下の通りです。 |
vp
ロックまたはロック解除される vnode。 flags |
LK_SHARED 共有ロック |
LK_EXCLUSIVE 排他的ロック |
LK_UPGRADE 共有から排他的へのアップグレード |
LK_EXCLUPGRADE 最初の共有から排他的へのアップグレード |
LK_DOWNGRADE 排他的から共有へのダウングレード |
LK_RELEASE 全てのロックタイプの解除 |
LK_DRAIN ロック状態終了までの待機 |
ロックタイプは、以下のロックフラグと OR されているかもしれません。 |
LK_NOWAIT ロックを待つために sleep しない ロックタイプは、以下の制御フラグと OR されているかもしれません。 LK_INTERLOCK 呼び出し側が既に簡易ロックを保持している時に
指定 (VOP_LOCK はロックを取得した後で簡易
ロックを解除します) |
td
ロックを使用するためのスレッドコンテキスト。 カーネルコードは vnode をロックするために VOP_LOCK() を直接呼び出さずに、 vn_lock() を使用するべきです。 戻り値 |
成功時には 0 が返され、そうでない場合にはエラーが返されます。 |
疑似コード
struct vopnode { int von_flag; /* * 他のファイルシステム固有データ */ ...; }; |
#define VON_LOCKED |
1 |
|||
#define VON_WANTED |
2 |
|||
#define VTOVON(vp) |
((struct vopnode *) (vp)->v_data) |
int start: |
vp->v_flag |= VXWANT; |
|
tsleep((caddr_t)vp, PINOD, "voplk1", 0); |
} |
return ENOENT; |
vop = VTOVON(vp); |
vop->von_flag |= VON_WANTED; |
|
tsleep((caddr_t) vop, PINOD, "voplk2", 0); |
|
goto start; |
} vop->von_flag |= VON_LOCKED; return 0; int if ((vop->von_flag & VON_LOCKED) == 0) { |
panic("vop_unlock not locked"); |
} |
vop->von_flag &= ~VON_WANTED; |
|
wakeup((caddr_t) vop); |
} return 0; int if (vop->von_flag & VON_LOCKED) |
return 1; |
else |
return 0; |
} |
関連項目
作者
このマニュアルページは Doug Rabson が書きました。 FreeBSD 10.0 July 24, 1996 FreeBSD 10.0 |