次: CVSROOT storage, 前: CVS in repository, 上: Repository storage
利用者から見える部分の CVS のロックに焦点をあてた紹介は Concurrency を参照してください。次の部分は同じリポジトリをアクセ スする他のツールに干渉することなく CVS のリポジトリにアクセスするよう なツールを書きたい人を対象にしています。読み込みロック (read lock), 書き込みロック (write lock), デッ ドロック (deadlock) のような概念がよくわからなかったら、オペレー ティングシステムやデータベースの文献を参照すると良いかもしれません。
リポジトリ中の #cvs.rfl. で始まる全てのファイルは読み込みロック です。リポジトリ中の #cvs.wfl で始まる全てのファイルは書き込み ロックです。古いバージョンの CVS (CVS 1.5 以前) は #cvs.tfl で 始まる名前のファイルも作成していましたが、ここではそれらは議論しません。 ディレクトリ #cvs.lock はマスターロックとして働きます。すなわち、 他のロックを取得する前に、まずこのロックを取得しなければならない、とい うことです。
書き込みロックを取得するためには、まず #cvs.lock ディレクトリを 作成します。この操作は原子的操作でなければなりません (これはたいていの オペレーティングシステムで真のはずです)。 既にディレクトリが存在したた めに失敗すれば、しばらく待ってもう一度試します。#cvs.lock ロッ クを取得した後、#cvs.rfl. の後に選択した情報 (例えば、ホスト名 とプロセス番号) が続いた名前のファイルを作成します。それからマスターロッ クを解放するために #cvs.lock ディレクトリを消去します。それから リポジトリを読んで続行します。終った後、読み込みロックを解放するために #cvs.rfl ファイルを消去します。
書き込みロックを取得するためには、読み込みロックと同様にまず #cvs.lock ディレクトリを作成します。それから #cvs.rfl. で始まるファイルが無いかどうかを調べます。もしあれば、#cvs.lock を消去し、しばらく待って、もう一度試します。読み込み手がいないときは、 #cvs.wfl の後に選択した情報を続けた名前のファイルを作成します (例えば、ホスト名とプロセス番号)。ロック #cvs.lock を続けます。 リポジトリへの書き込みを実行します。それが終わると、まず #cvs.wfl ファイルを消去し、それから #cvs.lock ディレクト リを消去します。#cvs.rfl ファイルと違って、#cvs.wfl ファ イルは情報提供のためだけにあることに注意してください。#cvs.lock そのもののロックを続ける以上のロック操作の効果はありません。
それぞれのロック (書き込みロック及び読み込みロック) は Attic と CVS を含んだリポジトリの単独のディレクトリのみをロックしますが、 バージョン管理下の他のディレクトリは含まないことに注意してください。木 全体をロックするためには、それぞれのディレクトリをロックする必要があり ます (必要なロックのどれかの取得に失敗したら、デッドロックを避けるため に再挑戦の前に木全体を解放しなければならないことに注意してください)。
cvs は個々の foo,v ファイルへのアクセス制御のために書き込 みロックを期待するということにも注意してください。rcs には ,foo, ファイルがロックとして働く機構がありますが、cvs はそ れを実装しておらず、cvs の書き込みロックを取り出すことが推奨され ています。さらなる議論/合理性は cvs のソースコードの rcs_internal_lockfile のところのコメントを読んでください。