diff options
Diffstat (limited to 'documentation/manual-pages/ja/man9/VOP_LOCK.9')
-rw-r--r-- | documentation/manual-pages/ja/man9/VOP_LOCK.9 | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/documentation/manual-pages/ja/man9/VOP_LOCK.9 b/documentation/manual-pages/ja/man9/VOP_LOCK.9 new file mode 100644 index 0000000000..aea28c4736 --- /dev/null +++ b/documentation/manual-pages/ja/man9/VOP_LOCK.9 @@ -0,0 +1,177 @@ +.\" -*- nroff -*- +.\" +.\" Copyright (c) 1996 Doug Rabson +.\" +.\" All rights reserved. +.\" +.\" This program is free software. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR +.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +.\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT, +.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.\" %FreeBSD: src/share/man/man9/VOP_LOCK.9,v 1.14 2003/05/31 14:07:25 hmp Exp % +.\" +.\" $FreeBSD$ +.Dd July 24, 1996 +.Os +.Dt VOP_LOCK 9 +.Sh 名称 +.Nm VOP_LOCK , +.Nm VOP_UNLOCK , +.Nm VOP_ISLOCKED , +.Nm vn_lock +.Nd vnode アクセスの直列化 +.Sh 書式 +.In sys/param.h +.In sys/lock.h +.In sys/vnode.h +.Ft int +.Fn VOP_LOCK "struct vnode *vp" "int flags" "struct thread *td" +.Ft int +.Fn VOP_UNLOCK "struct vnode *vp" "int flags" "struct thread *td" +.Ft int +.Fn VOP_ISLOCKED "struct vnode *vp" "struct thread *td" +.Ft int +.Fn vn_lock "struct vnode *vp" "int flags" "struct thread *td" +.Sh 解説 +これらの呼び出しは、 +ファイルシステムへのアクセスを直列化するために使用されます。 +例えば、同一ファイルに対する 2 つの書き込みが同時に発生することを +避けるために使用します。 +.Pp +引数は以下の通りです。 +.Bl -tag -width flags +.It Fa vp +ロックまたはロック解除される vnode。 +.It Fa flags +以下のロック要求タイプのひとつ。 +.Bl -column LK_EXCLUPGRADE -offset indent +.It Dv LK_SHARED Ta 共有ロック +.It Dv LK_EXCLUSIVE Ta 排他的ロック +.It Dv LK_UPGRADE Ta 共有から排他的へのアップグレード +.It Dv LK_EXCLUPGRADE Ta 最初の共有から排他的へのアップグレード +.It Dv LK_DOWNGRADE Ta 排他的から共有へのダウングレード +.It Dv LK_RELEASE Ta 全てのロックタイプの解除 +.It Dv LK_DRAIN Ta ロック状態終了までの待機 +.El +.Pp +ロックタイプは、以下のロックフラグと +.Em OR +されているかもしれません。 +.Bl -column LK_CANRECURSE -offset indent +.It Dv LK_NOWAIT Ta ロックを待つために sleep しない +.It Dv LK_SLEEPFAIL Ta sleep して、失敗を返す +.It Dv LK_CANRECURSE Ta 再帰的排他的ロックを認める +.It Dv LK_REENABLE Ta ロック消失後再有効化されるべき +.It Dv LK_NOPAUSE Ta 空回りしない +.El +.Pp +ロックタイプは、以下の制御フラグと +.Em OR +されているかもしれません。 +.Bl -column LK_INTERLOCK -offset indent +.It Dv LK_INTERLOCK Ta 呼び出し側が既に簡易ロックを保持している時に指定 +(VOP_LOCK はロックを取得した後で簡易ロックを解除します) +.It Dv LK_RETRY Ta ロックされるまでリトライ +.It Dv LK_NOOBJ Ta オブジェクトを作成しない +.El +.It Fa td +ロックを使用するためのスレッドコンテキスト。 +.El +.Pp +カーネルコードは vnode をロックするために +.Fn VOP_LOCK +を直接呼び出さずに、 +.Fn vn_lock +を使用するべきです。 +.Sh 戻り値 +成功時には 0 が返され、そうでない場合にはエラーが返されます。 +.Sh 疑似コード +.Bd -literal +struct vopnode { + int von_flag; + /* + * 他のファイルシステム固有データ + */ + ...; +}; +#define VON_LOCKED 1 +#define VON_WANTED 2 +#define VTOVON(vp) ((struct vopnode *) (vp)->v_data) + +int +vop_lock(struct vnode *vp) +{ + struct vopnode* vop; + +start: + while (vp->v_flag & VXLOCK) { + vp->v_flag |= VXWANT; + tsleep((caddr_t)vp, PINOD, "voplk1", 0); + } + if (vp->v_tag == VT_NON) + return ENOENT; + + vop = VTOVON(vp); + if (vop->von_flag & VON_LOCKED) { + vop->von_flag |= VON_WANTED; + tsleep((caddr_t) vop, PINOD, "voplk2", 0); + goto start; + } + + vop->von_flag |= VON_LOCKED; + + return 0; +} + +int +vop_unlock(struct vnode *vp) +{ + struct vopnode *vop = VTOVON(vp); + + if ((vop->von_flag & VON_LOCKED) == 0) { + panic("vop_unlock not locked"); + } + vop->von_flag &= ~VON_LOCKED; + if (vop->von_flag & VON_WANTED) { + vop->von_flag &= ~VON_WANTED; + wakeup((caddr_t) vop); + } + + return 0; +} + +int +vop_islocked(struct vnode *vp) +{ + struct vopnode *vop = VTOVON(vp); + + if (vop->von_flag & VON_LOCKED) + return 1; + else + return 0; +} +.Ed +.Sh 関連項目 +.Xr vnode 9 +.Sh 作者 +このマニュアルページは +.An Doug Rabson +が書きました。 |