doc/ja_JP.eucJP/man/man9/lock.9
Jun Kuriyama bc77f45bee Fix typo.
Submitted by:	kano@na.rim.or.jp
		(via SUZUKI Koichi <metal@gc5.so-net.ne.jp>)
2004-03-23 13:39:31 +00:00

280 lines
7.6 KiB
Groff

.\"
.\" Copyright (C) 2002 Chad David <davidc@acns.ab.ca>. All rights reserved.
.\"
.\" 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(s), this list of conditions and the following disclaimer as
.\" the first lines of this file unmodified other than the possible
.\" addition of one or more copyright notices.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice(s), 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 COPYRIGHT HOLDER(S) ``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 COPYRIGHT HOLDER(S) 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/lock.9,v 1.11 2003/09/08 19:57:21 ru Exp %
.\"
.\" $FreeBSD$
.Dd July 9, 2001
.Dt LOCK 9
.Os
.Sh 名称
.Nm lockinit ,
.Nm lockdestroy ,
.Nm lockcount ,
.Nm lockmgr ,
.Nm lockstatus ,
.Nm lockmgr_printinfo
.Nd lockmgr ファミリの関数
.Sh 書式
.In sys/types.h
.In sys/lockmgr.h
.Ft void
.Fn lockinit "struct lock *lkp" "int prio" "const char *wmesg" "int timo" "int flags"
.Ft void
.Fn lockdestroy "struct lock *lkp"
.Ft int
.Fn lockcount "struct lock *lkp"
.Ft int
.Fn lockmgr "struct lock *lkp" "u_int flags" "struct mtx *interlkp" "struct thread *td"
.Ft int
.Fn lockstatus "struct lock *lkp" "struct thread *td"
.Ft void
.Fn lockmgr_printinfo "struct lock *lkp"
.Sh 解説
.Fn lockinit
関数はロックを初期化するために使用されます。
これはロックに関する実行されることが可能なあらゆる操作の前に、
呼び出されなければなりません。
引数は以下の通りです。
.Bl -tag -width ".Fa wmesg"
.It Fa lkp
初期化されるべきロックへのポインタです。
.It Fa prio
.Xr msleep 9
に渡される優先度です。
.It Fa wmesg
ロックのメッセージです。
これはデバッグ出力と
.Xr msleep 9
の両方のために使用されます。
.It Fa timo
.Xr msleep 9
に渡されるタイムアウト値です。
.It Fa flags
ロックを初期化するために使用されるべきフラグです。
.Bl -tag -width ".Dv LG_CANRECURSE"
.It Dv LK_NOWAIT
ロックを獲得するとき、スリープしません。
.It Dv LK_SLEEPFAIL
スリープした後に失敗します。
.It Dv LK_CANRECURSE
再帰的な排他ロックを許可します。
.It Dv LK_REENABLE
ロックをドレインした後、そのロックを再度有効化します。
.It Dv LK_NOPAUSE
ロックを獲得するとき、スピンロックを使用しません。
.It Dv LK_TIMELOCK
スリープしている間
.Fa timo
を使用します。そうでなければ 0 が使用されます。
.El
.El
.Pp
.Fn lockdestroy
関数はロックを破壊するために使用され、カーネル内のいくつかの場所で
呼び出されますが、現在は何もしません。
.Pp
.Fn lockcount
関数はロック
.Fa lkp
に対する排他ロックと共有ロックのカウント数を返します。
.Pp
.Fn lockmgr
関数は共有ロックと排他ロックおよび再帰のサポートを含む、
カーネル内部の一般的なロック機能を取り扱います。
.Fn lockmgr
はロックのアップグレードとダウングレードも可能です。
.Pp
引数は以下の通りです。
.Bl -tag -width ".Fa interlkp"
.It Fa lkp
操作するべきロックへのポインタです。
.It Fa flags
行なわれるべき操作を示しているフラグです。
.Bl -tag -width ".Dv LK_EXCLUPGRADE"
.It Dv LK_SHARED
共有ロックを獲得します。
現在排他ロックが保持されている場合には、ダウングレードされます。
.It Dv LK_EXCLUSIVE
排他ロックを獲得します。
既に排他ロックが保持されていて、
.Dv LK_CANRECURSE
が設定されていない場合には、システムは
.Xr panic 9
します。
.It Dv LK_DOWNGRADE
排他ロックから共有ロックにダウングレードします。
共有ロックのダウングレードは許可されていません。
排他ロックが既に再帰している場合には、全ての参照がダウングレードされます。
.It Dv LK_EXCLUPGRADE
共有ロックから排他ロックにアップグレードします。
他の誰かが先にアップグレードを待っている最中の場合には、
.Er EBUSY
で失敗します。
この呼び出しが失敗した場合には、その共有ロックは失われます。
排他ロックのアップグレードの試みは
.Xr panic 9
を引き起こします。
.It Dv LK_UPGRADE
共有ロックから排他ロックにアップグレードします。
この呼び出しが失敗した場合には、その共有ロックは失われます。
排他ロックのアップグレードの試みは
.Xr panic 9
を引き起こします。
.It Dv LK_RELEASE
ロックを解放します。
保持していないロックの解放は、
.Xr panic 9
を引き起こすことがあります。
.It Dv LK_DRAIN
ロック上の全ての行動の終了を待ち、それから役割を終えた印を付けます。
今にも解放されようとしているメモリの一部分のロックを解放する前に使用されます。
.In ( sys/lockmgr.h
に解説されています。)
.It Dv LK_SLEEPFAIL
操作がスリープした場合には、失敗します。
.It Dv LK_NOWAIT
この呼び出しがスリープすることを認めません。
これはロックをテストするために使用することが可能です。
.It Dv LK_CANRECURSE
排他ロック上の再帰を認めます。
それぞれのロックに対し、解放が存在しなければなりません。
.It Dv LK_INTERLOCK
(既にロックされているべき) 相互ロックをロック解除します。
.El
.It Fa interlkp
ロックへのグループアクセスを制御するための相互ロック mutex です。
.Dv LK_INTERLOCK
が指定された場合には、
.Fn lockmgr
.Fa interlkp
は現在所有されていて再帰していないと仮定し、ロック解除されて返します。
.Xr mtx_assert 9
を参照してください。
.It Fa td
この呼び出しに責任があるレッドです。
.Dv NULL
.Dv LK_KERNPROC
になります。
.El
.Pp
.Fn lockstatus
関数は渡された
.Vt thread
に関するロックの状態を返します。
.Fa td
.Dv NULL
で排他ロックが保持されている場合には、
.Dv LK_EXCLUSIVE
が返されます。
.Pp
.Fn lockmgr_printinfo
関数はロックについてのデバッグ情報を出力します。
これは主に
.Xr VOP_PRINT 9
関数によって使用されます。
.Sh 戻り値
.Fn lockcount
関数は 0 以上の整数を返します。
.Pp
.Fn lockmgr
関数は成功時には 0 を、失敗時には 0 ではない値を返します。
.Pp
.Fn lockstatus
関数は以下の値を返します。
.Bl -tag -width ".Dv LK_EXCLUSIVE"
.It Dv LK_EXCLUSIVE
スレッド
.Fa td
によって排他ロックが保持されています。
.It Dv LK_EXCLOTHER
スレッド
.Fa td
ではない他の誰かによって排他ロックが保持されています。
.It Dv LK_SHARED
共有ロックが保持されています。
.It Li 0
だれもロックを保持していません。
.El
.Sh エラー
.Fn lockmgr
は次の場合に失敗します。
.Bl -tag -width Er
.It Bq Er EBUSY
.Dv LK_FORCEUPGRADE
が要求されて、ほかのスレッドが既にロックのアップグレードを要求しています。
.It Bq Er EBUSY
.Dv LK_NOWAIT
が設定されて、スリープが要求されていました。
.It Bq Er ENOLCK
.Dv LK_SLEEPFAIL
が設定されて、
.Fn lockmgr
は既にスリープしました。
.It Bq Er EINTR
ロックの優先度に
.Dv PCATCH
が設定されて、スリープしている間にシグナルが配送されました。
下記の
.Er ERESTART
エラーに注意してください。
.It Bq Er ERESTART
ロックの優先度に
.Dv PCATCH
が設定されて、スリープしている間にシグナルが配送され、システムコールが
再スタートされました。
.It Bq Er EWOULDBLOCK
0 でないタイムアウトが与えられ、そのタイムアウトが満了しました。
.El
.Sh ロック
.Fn lockmgr
への
.Fa flags
引数に
.Dv LK_INTERLOCK
が渡された場合には、
.Fa interlkp
.Fn lockmgr
を呼び出すために以前に保持されていなければならず、ロック解除されて返されます。
.Pp
失敗するアップグレードの試みは、現在保持しているロックを失わせる
結果になります。
また、排他ロックのアップグレードは無効で、試行の結果として
.Xr panic 9
を引き起こします。
.Sh 関連項目
.Xr msleep 9 ,
.Xr mtx_assert 9 ,
.Xr panic 9 ,
.Xr VOP_PRINT 9
.Sh 作者
このマニュアルページは
.An Chad David Aq davidc@acns.ab.ca
が書きました。