(57)【特許請求の範囲】
【請求項１】
リンク・リストを保持する方法であって、
前記リストの被ブロック部分の直後のリスト要素の参照を含むバイパス要素のリストを含み、更新タスクにより使用される前記リンク・リストを外部参照させる、前記リンク・リストの補助データ構造を確立するステップと、
前記補助データ構造を通じて前記リストを更新する、第１の更新タスクを開始するステップと、
ブロッキング・データを前記補助データ構造内に記録することにより、前記補助データ構造を通じて前記リンク・リストをアクセスする他の更新タスクが、前記リンク・リストの全ての要素よりも少ない該リンク・リストの第１の部分を変更するのをブロックするステップと、
アクション・セットからアクションを実行することにより、前記リンク・リストの前記第１の部分内の該リンク・リストを更新するステップと
を含み、前記アクション・セットが、
ａ）前記リンク・リストから、該リンク・リストの前記第１の部分内の要素を削除するアクションと、
ｂ）前記リンク・リストの前記第１の部分内の該リンク・リストに要素を挿入するアクションと
を含む、方法。
【請求項２】
前記ブロッキング・データを記録するステップが、
前記リンク・リストの前記第１の部分の第１のリスト要素の参照を変更し、代わりにバイパス要素を参照するようにするステップを含み、
前記リンク・リストをトラバースするが、前記リンク・リストを変更しないタスクが、前記リンク・リストの前記第１の部分を通り過ぎ、前記バイパス要素を通じて前記リストをトラバースする、請求項１記載の方法。
【請求項３】
前記リンク・リストが２重リンク・リストである、請求項１記載の方法。
【請求項４】
前記ブロッキング・データを記録するステップによりブロックされる前記リンク・リストの前記第１の部分が、高々３つのリンクから成る、請求項１記載の方法。
【請求項５】
前記補助データ構造を通じて、前記リンク・リストを更新する第２の更新タスクを開始するステップと、
ブロッキング・データを前記補助データ構造内に記録することにより、前記補助データ構造を通じて前記リンク・リストをアクセスする前記第２の更新タスク以外のタスクが、前記リンク・リストの全ての要素よりも少ない該リンク・リストの第２の部分を変更するのをブロックするステップと、
アクション・セットからアクションを実行することにより、前記リンク・リストの前記第２の部分内の該リンク・リストを更新するステップと
を含み、前記アクション・セットが、
ａ）前記リンク・リストから、該リンク・リストの前記第２の部分内の要素を削除するアクションと、
ｂ）前記リンク・リストの前記第２の部分内の該リンク・リストに要素を挿入するアクションと
を含み、前記第２の部分内の前記リンク・リストを更新するステップが、第１の部分内の前記リンク・リストを更新するステップと同時に実行される、請求項１記載の方法。
【請求項６】
前記リンク・リスト内の任意のリンクを指し示すポインタを受け渡し、前記リンク・リストを変更するためのポイントを位置指定するステップを含み、前記ブロッキング・データを記録するステップによりブロックされる前記第１の部分が、少なくとも前記任意のリンクの一部を含む、請求項１記載の方法。
【請求項７】
前記補助データ構造がオブジェクト指向プログラミング構造のクラス階層内のオブジェクトである、請求項１記載の方法。
【請求項８】
前記クラス階層が、前記リンク・リストを変更することなく、該リンク・リストをトラバースするオブジェクトのための第１のクラスと、前記リンク・リストをトラバースし、該リンク・リストを変更するオブジェクトのための第２のクラスとを含む、請求項７記載の方法。
【請求項９】
前記クラス階層が、前記リンク・リストを変更することなく該リンク・リストをトラバースし、リスト・レベルのブロッキング・アクセスを有するオブジェクトのための第３のクラスと、前記リンク・リストを変更することなく該リンク・リストをトラバースし、リンク・レベルのブロッキング・アクセスを有するオブジェクトのための第４のクラスと、前記リンク・リストをトラバースし、該リンク・リストを変更し、リスト・レベルのブロッキング・アクセスを有するオブジェクトのための第５のクラスと、前記リンク・リストをトラバースし、該リンク・リストを変更し、リンク・レベルのブロッキング・アクセスを有するオブジェクトのための第６のクラスとを含み、前記第３及び第４のクラスが前記第１のクラスから継承され、前記第５及び第６のクラスが前記第２のクラスから継承される、請求項８記載の方法。
【請求項１０】
順序付け関係が前記リンク・リストに対して定義される、請求項１記載の方法。
【請求項１１】
マルチタスク・コンピュータ・システムにおいて、２重リンク・リストを更新する方法であって、
前記２重リンク・リストの興味対象の領域内で、前記２重リンク・リストの全てのリンクよりも少ない第１の連続リンクのセットを識別するステップと、
第１のタスク以外のタスクが、前記第１の連続リンクのセットの少なくとも一部のリンクを変更するのをブロックする一方、前記第１のタスク以外のタスクが、前記第１のセットに含まれない前記２重リンク・リストのリンクを変更することをブロックしないステップと、
操作セットから操作を実行することにより、前記第１のセット内の前記２重リンク・リストを変更するステップであって、前記操作セットが、前記第１のタスクにより実行される操作、すなわち、
ａ）前記２重リンク・リストから前記第１のセットのリンクを削除する操作と、
ｂ）前記２重リンク・リスト内の前記第１のセットの２つのリンクの間に、リンクを挿入する操作と
を含む、変更するステップと、
前記変更するステップを実行後、前記第１のタスク以外のタスクが、前記第１のセットの少なくとも一部のリンクを変更するのをブロック解除するステップと
を含む、方法。
【請求項１２】
前記タスクをブロックするステップによりブロックされる前記リンク・リストの第１の連続リンクのセットが、高々３つのリンクから成る、請求項１１記載の方法。
【請求項１３】
前記第１の連続リンクのセットを識別するステップが、前記リンク・リスト内の前記第１のセット内に存在する任意のリンクを指し示すポインタを受信し、前記リンク・リストを変更するためのポイントを位置指定するステップを含む、請求項１１記載の方法。
【請求項１４】
前記２重リンク・リストの興味対象の領域内で、前記２重リンク・リストの全てのリンクよりも少ない第２の連続リンクのセットを識別するステップと、
第２のタスク以外のタスクが、前記第２の連続リンクのセットの少なくとも一部のリンクを変更するのをブロックする一方、前記第２のタスク以外のタスクが、前記第２のセットに含まれない前記２重リンク・リストのリンクを変更することをブロックしないステップと、
操作セットから操作を実行することにより、前記第２のセット内の前記２重リンク・リストを変更するステップであって、前記操作セットが、前記第２のタスクにより実行される操作、すなわち、
ａ）前記２重リンク・リストから前記第２のセットのリンクを削除する操作と、
ｂ）前記２重リンク・リスト内の前記第２のセットの２つのリンクの間に、リンクを挿入する操作と
を含む、変更するステップと、
前記第２のセット内の前記２重リンク・リストを変更するステップを実行後、前記第２のタスク以外のタスクが、前記第２のセットの少なくとも一部のリンクを変更するのをブロック解除するステップと
を含み、前記第２のセット内の前記２重リンク・リストを変更するステップが、前記第１のタスク以外のタスクが、前記第１のセットのリンクを変更するのをブロックするステップの後に、且つ前記第１のタスク以外のタスクが、前記第１のセットのリンクを変更するのをブロック解除するステップの前に実行される、請求項１１記載の方法。
【請求項１５】
コンピュータ読取り可能媒体上に記録された複数のコンピュータ実行可能命令を含み、リンク・リストを保持するコンピュータ・プログラムであって、前記プログラムが、
前記リストの被ブロック部分の直後のリスト要素の参照を含むバイパス要素のリストを含み、更新タスクにより使用される前記リンク・リストを外部参照させる、前記リンク・リストの補助データ構造を確立するステップと、
前記補助データ構造を通じて前記リストを更新する、第１の更新タスクを開始するステップと、
ブロッキング・データを前記補助データ構造内に記録することにより、前記補助データ構造を通じて前記リンク・リストをアクセスする他の更新タスクが、前記リンク・リストの全ての要素よりも少ない該リンク・リストの第１の部分を変更するのをブロックするステップと、
アクション・セットからアクションを実行することにより、前記リンク・リストの前記第１の部分内の該リンク・リストを更新するステップと
を含み、前記アクション・セットが、
ａ）前記リンク・リストから、該リンク・リストの前記第１の部分内の要素を削除するアクションと、
ｂ）前記リンク・リストの前記第１の部分内の該リンク・リストに要素を挿入するアクションと
をコンピュータに実行させるプログラム。
【請求項１６】
前記ブロッキング・データを記録するステップが、
前記リンク・リストの前記第１の部分の第１のリスト要素の参照を変更し、代わりにバイパス要素を参照するようにするステップを含み、
前記リンク・リストをトラバースするが、前記リンク・リストを変更しないタスクが、前記リンク・リストの前記第１の部分を通り過ぎ、前記バイパス要素を通じて前記リストをトラバースする、
請求項１５記載のコンピュータ・プログラム。
【請求項１７】
前記リンク・リストが２重リンク・リストである、請求項１５記載のコンピュータ・プログラム。
【請求項１８】
前記ブロッキング・データを記録するステップによりブロックされる前記リンク・リストの前記第１の部分が、高々３つのリンクから成る、請求項１５記載のコンピュータ・プログラム。
【請求項１９】
前記プログラムが、
前記補助データ構造を通じて、前記リンク・リストを更新する第２の更新タスクを開始するステップと、
ブロッキング・データを前記補助データ構造内に記録することにより、前記補助データ構造を通じて前記リンク・リストをアクセスする前記第２の更新タスク以外のタスクが、前記リンク・リストの全ての要素よりも少ない該リンク・リストの第２の部分を変更するのをブロックするステップと、
アクション・セットからアクションを実行することにより、前記リンク・リストの前記第２の部分内の該リンク・リストを更新するステップと
を含み、前記アクション・セットが、
ａ）前記リンク・リストから、該リンク・リストの前記第２の部分内の要素を削除するアクションと、
ｂ）前記リンク・リストの前記第２の部分内の該リンク・リストに、要素を挿入するアクションと
を含み、前記第２の部分内の前記リンク・リストを更新するステップが、第１の部分内の前記リンク・リストを更新するステップと同時に実行される、請求項１５記載のコンピュータ・プログラム。
【請求項２０】
前記プログラムが、前記リンク・リスト内の任意のリンクを指し示すポインタを受け渡し、前記リンク・リストを変更するためのポイントを位置指定するステップを含み、前記ブロッキング・データを記録するステップによりブロックされる前記第１の部分が、前記任意のリンクを含む、請求項１５記載のコンピュータ・プログラム。
【請求項２１】
前記補助データ構造がオブジェクト指向プログラミング構造のクラス階層内のオブジェクトである、請求項１５記載のコンピュータ・プログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明はデジタル・データ処理システムに関し、特に、一般にリンク・リストとして知られるソフトウェア・データ構造に関する。
【０００２】
【従来の技術】
最新のコンピュータ・システムは一般に、中央処理ユニット（ＣＰＵ）と、通信バス及びメモリなどの情報を記憶、検索及び転送するために必要な支援ハードウェアとから構成される。更に、外部と通信するために必要な入出力制御装置や記憶制御装置などのハードウェア、それらに接続されるキーボード、モニタ、テープ・ドライブ、ディスケット・ドライブなどの装置、更にネットワークに接続される通信回線などが含まれる。ＣＰＵはシステムの心臓部であり、コンピュータ・プログラムを構成し、他のシステム要素の動作を指図する命令を実行する。
【０００３】
コンピュータ・ハードウェアの観点からすると、ほとんどのシステムは基本的に同じように動作する。プロセッサは算術比較や論理比較、或いはある位置から別の位置へのデータの移動などの非常に単純な操作の限られたセットを実行することができる。各操作は非常に高速に実行される。プログラムはコンピュータに、非常に多数のこれらの単純な操作を実行するように指図し、コンピュータが何か複雑なことを実行しているかのような幻想を抱かせる。
【０００４】
コンピュータ・システムが様々なタスクにおいて使用される事実は、主として、コンピュータ・プロセッサの実行を指図する豊富で種々のソフトウェアに起因する。ここ数年に渡り、ハードウェアと同様、ソフトウェアはより複雑に進化し成長した。特定のソフトウェア・アプリケーションは非常に特殊化されるかもしれないが、当業者によって繰り返し使用される決まった共通の技術及び構造が存在する。ソフトウェアを改善し、それによりコンピュータ・システムにおいてソフトウェアを不可欠要素にする１態様は、これらの一般に使用されるソフトウェア技法及び構造を改善することによる。
【０００５】
ソフトウェア設計者はデータを構造化する必要性、すなわち過度な努力無しにデータが検索され、操作されるように、データを論理的に構成する必要性を十分に認識している。ソフトウェア・アプリケーションにより使用されるデータの構造は、アプリケーションを計画し、開発する際に最初に決定される１項目である。ほとんどのあらゆるカスタム・データ構造が作成され得るが、幾つかの一般的なタイプのデータ構造がソフトウェア設計者により、再三再四使用されてきた。最も偏在するものの１つはリンク・リストであり、これは単独にリンクされるか、２重にリンクされる。
【０００６】
リンク・リストはデータ要素の集合であり、集合内の各要素は集合内の次の要素への参照を含む。１要素は参照の他に１変数だけを含むか、テキスト・ストリング、数値データ、ポインタなどの多くの異なるタイプのデータを含む複雑なデータ構造であるか、或いは、参照の他に何も含まないダミーであってもよい。参照は一般に、次のリスト要素のメモリ・アドレスを指し示すポインタであるが、次の要素のアドレスまたは他の位置を導出する配列指標や、他の量の形態を取ってもよい。単純化のためリンク・リスト要素内の参照は、そのアドレスを直接指し示すか、前述のようにアドレスの獲得場所を間接的に指標化するかに関わらず、ここでは"ポインタ"と称される。リンク・リスト要素のアドレスまたは他の記憶域参照は、順序付けを守ることを要求されず、従って、リスト内の全てのまたは相当数の要素を再割当てすることなく、要素をリンク・リストに挿入したり、要素をリンク・リストから削除することが可能である。隣接要素のポインタを変更することだけが必要である。リンク・リストは、１方向にだけ走行する順方向ポインタを有して単独にリンクされるか、或いは、順方向ポインタ及び逆方向ポインタの両方を有して２重にリンクされる。
【０００７】
マルチタスク環境においてリンク・リストを更新する際には注意を要する。複数の同時実行スレッドが同時に同一のリンク・リストを変更しようとする場合、或いは別のスレッドがリストをトラバース中に１つのスレッドがリストを変更しようとする場合、結果は予測不能であり、データが破壊する可能性がある。この問題は特に、単一ＣＰＵがハードウェア・マルチスレッド化をサポートする場合、或いは、複数のＣＰＵが複数のスレッドを同時に実行して、全てが共通メモリをアクセスする場合に重大となる。
【０００８】
単独リンク・リストの場合、特定タイプのアトミック操作の使用を通じてリストを更新することが一部の環境では可能である。しかしながら、このアプローチは全ての環境において実現可能ではなく、一般には、２つの異なるリスト要素に関わるポインタを更新することが要求される２重リンク・リストには、適用できない。一般に使用されるより汎用的な解決策は、ロックのシステムである。リンク・リストを更新したいタスクは通常、リスト上で排他ロックを獲得し、これにより更新が完了するまで他のタスクはリストをアクセスすることを阻止される。リストを変更することなくリストをトラバースしたいタスクは、共用ロックを獲得し、他のタスクがリストを変更することを阻止するが、トラバースすることは必ずしも阻止しない。
【０００９】
ロックの使用は単純で有効であるが、性能に影響を及ぼす潜在性を有する。リストをトラバースし、特定の要素を探索するには時間を要する。この時間の間、全ての他のプロセッサはリストを変更することを阻止され、ロックのタイプによっては、リストをトラバースすることさえ禁止される。小さなリスト及び孤立したアプリケーションで使用されるリストでは、これは問題とならないかもしれない。しかしながら、オペレーティング・システム内のタスクの状態を保持するために使用されるリストなど、大規模で頻繁にアクセスされるリストが存在する。こうしたリストの排他ロックは性能上の障害となり得る。こうした障害は複数のＣＰＵを使用するシステムにおいてより起こり得る。
【００１０】
【発明が解決しようとする課題】
従来方法の欠点無しに、リンク・リストを更新する方法、特に他のプロセッサにおいて実行されるタスクを妨害することなく、マルチプロセッサ環境において、２重リンク・リストを含むリンク・リストを更新する方法が待望される。
【００１１】
【課題を解決するための手段】
本発明によれば、リンク・リストが、更新タスクにより使用されるリンク・リストの外部参照を含む、関連補助データ構造を有する。この補助データ構造は、リンク・リストのサブセットが他のタスクにより変更されるのを阻止し、それにより個別のサブセットの同時更新を可能にする。
【００１２】
好適な実施例では、リンク・リスト保守がオブジェクト指向（ＯＯ）プログラミング技法を用いて達成される。好適には、リストは２重リンク・リストである。補助データ構造はSharedList（共用リスト）と呼ばれるオブジェクトであり、これはインスペクタ・オブジェクト及びミューテータ・オブジェクトを含むイテレータ・オブジェクトと、ブロッカ・オブジェクトと、ビュー・オブジェクトとから成る。イテレータ・オブジェクトはクライアントにより、リンク・リストを外部的にアクセスするために使用される。インスペクタ・オブジェクトは、リストを変更することなくトラバースするタイプのイテレータ・オブジェクトであり、ミューテータ・オブジェクトは、リストを変更できるタイプのイテレータ・オブジェクトであり、リストをトラバースしてもよい。インスペクタ及びミューテータの両者は、関連ビュー・オブジェクトを有し、これは実際のリスト要素を指し示すポインタを含む。ミューテータは更に、選択リスト要素へのアクセスを阻止する関連ブロック・オブジェクトを有する（但し、インスペクタはそうではない）。動作に際してミューテータ・オブジェクトは、ポインタがブロッカ・オブジェクトを指し示すようにそれらを変更することにより、リンク・リストの一部をブロックする。ブロッカ・オブジェクトは、ブロックされたリスト部分をバイパスする追加のポインタを含む。他のインスペクタはその後、バイパスされた部分を通じてリストをトラバースしてもよい。但し、リストをトラバースするミューテータは、被ブロック部分において待機する。
【００１３】
大規模なリンク・リストの比較的小さな部分だけをブロックすることにより、複数タスクが同時に異なるリスト要素をアクセスし、別々のリスト更新を実行できることにより、特に複数のプロセッサが使用される場合に、性能の改善が図れる。特に好適な実施例では、リスト全体とは対照的に個々のリスト要素のレベルにおいてブロックすることにより、複数のミューテータがお互いに干渉することなく、同時にリンク・リストの異なる部分をトラバース及び変更でき、インスペクタは１つ以上のミューテータにより変更されるリストを同時にトラバースできる。
【００１４】
【発明の実施の形態】
図面を通じて、同一の参照番号は同一部品を表す。図１は、本発明の好適な実施例に従い、リンク・リスト・データ構造を使用するコンピュータ・システム１００の主要ハードウェア・コンポーネントを示す。中央処理ユニット（ＣＰＵ）１０１Ａ、１０１Ｂ、１０１Ｃ、１０１Ｄは、主メモリ１０２からの命令及びデータに対して基本マシン処理機能を実行する。好適には、各プロセッサは、データを記憶するための関連キャッシュ１０３Ａ、１０３Ｂ、１０３Ｃ、１０３Ｄを有する。こうしたデータには、プロセッサにより実行される命令が含まれる。単純化のため、ＣＰＵ及びキャッシュはここでは、それぞれ参照番号１０１及び１０３により総称的に示される。メモリ・バス１０９はＣＰＵ１０１及びメモリ１０２の間でデータを転送する。ＣＰＵ１０１及びメモリ１０２はまた、メモリ・バス１０９及びバス・インタフェース１０５を介してシステムＩ／Ｏバス１１０と通信する。様々なＩ／Ｏ処理ユニット（ＩＯＰ）１１１乃至１１５がシステムＩ／Ｏバス１１０に接続されて様々な記憶装置及びＩ／Ｏ装置や、リモート装置または他のコンピュータ・システムと通信するためのリモート通信回線との通信をサポートする。こうした記憶装置及びＩ／Ｏ装置には、直接アクセス記憶装置（ＤＡＳＤ）１２１乃至１２３（例えば回転磁気ディスク・ドライブ・データ記憶装置）、テープ・ドライブ、ワークステーション、プリンタなどが含まれる。
【００１５】
図１はシステム構成の１例として示されるだけで、コンピュータ・システム内のコンポーネントの実際の数、タイプ及び構成は変更可能である。特に、本発明は単一のＣＰＵを有するシステムにおいて、並びに複数のＣＰＵを有するシステムにおいて使用され得る。その際、ＣＰＵの数は可変である。図１では様々なバスが示されるが、これらのバスは概念レベルにおいて様々な通信経路を表すために示されており、バスの実際の物理構成は変更可能であり、実際には、より複雑であるかもしれない。更に、各ＣＰＵ１０１に関連して、単一のキャッシュ１０３が示されるが、複数レベルのキャッシュが存在してもよく、幾つかのキャッシュが命令にあてがわれ、他のものが非実行データにあてがわれてもよい。或いはキャッシュが存在しなくてもよい。好適な実施例では、コンピュータ・システムはIBM AS/400コンピュータ・システムであるが、他のコンピュータ・システムも使用可能である。
【００１６】
図２は、メモリ１０２の主要ソフトウェア・コンポーネントの概念図である。オペレーティング・システム２０１は周知のように、デバイス・インタフェース、複数タスクの管理、メモリ・ページングの管理など、様々な低レベル・ソフトウェア機能を提供する。好適な実施例では、オペレーティング・システム２０１は、IBM AS/400システム上でオペレーティング・システム機能を実行する、時に"ライセンス内部コード"と呼ばれるコードの他に、ＯＳ／４００オペレーティング・システム・コードを含むが、他のオペレーティング・システムも使用可能である。データベース２０２は、その上でアプリケーションが実行されるデータの総称的集合として概念的に示される。多くの異なるタイプのデータベースが使用可能であり、それらには金融データ、書式及びテキスト・データ、ライブラリ・データ、医療データなどが含まれる。図２では単一の典型的なデータベースが示されるが、コンピュータ・システム１００は複数のデータベースを含んでもよいし、１つもデータベースを含まなくてもよい。アプリケーション２０３乃至２０５は、通常のデータベース２０２内のデータをアクセスすることによりユーザのために特定の作業を実行するプログラムである。例えば、アプリケーションはデータベース２０２内のデータを探索及び検索したり、データを編集したり、データに複雑な計算を実行して追加のデータを生成したり、幾つかの他のアプリケーションを実行したりする。これらのアプリケーションが図２に示されるが、アプリケーションの数は任意であり、通常、３つよりも多い。
【００１７】
オペレーティング・システム２０１内、データベース２０２内、及びアプリケーション２０３内には、リンク・リスト・データ構造２１０、２１１、２１２がそれぞれ存在する。これらの構造はデータ要素のリンク・リストを含む。これらのデータ要素はここでは"リンク"と称され、リストの基本単位であり、リストは任意の数のこうした要素またはリンクを含む。好適な実施例では、リストは２重リンク・リストであり、従って、各要素またはリンクは少なくとも２つのポインタを含み、一方は次の順次リンクを指し示し、他は順々に前のリンクを指し示す。リンクは任意的に追加のポインタを含み、これは例えばリスト・オブジェクトを指し示す。代わりに単独リンク・リストだけを使用することも可能であり、この場合、各要素は次のリンクを指し示す順方向ポインタを含むが、前のリンクを指し示す逆方向ポインタは含まない。好適な実施例によれば、各リンク・リスト・データ構造２１０乃至２１２は更に、リンク・リスト内のデータをアクセス及び更新するために使用される補助データ構造を含む。これについては以下で詳述される。
【００１８】
特定の数及びタイプのソフトウェア・エンティティが図２に示されるが、これらは説明のために示されるだけで、こうしたエンティティの実際の数は任意である。特に説明の都合上、リンク・リスト・データ構造がオペレーティング・システム２０１内、データベース内２０２及びアプリケーション・プログラム２０３内に存在するように示されるが、こうしたリンク・リスト・データ構造がオペレーティング・システム内だけに存在してもよいし、データベース内だけに存在してもよいし、アプリケーション・プログラム内だけに存在してもよい。或いは、任意の他の構造化データまたはプログラムの一部でない、孤立したデータ構造として存在してもよい。更に、図２のソフトウェア・コンポーネントは概念的にメモリ内に存在するように示されるが、一般に、コンピュータ・システムのメモリは全てのプログラム及び他のデータを同時に保持するには小さ過ぎること、及び情報が一般にデータ記憶装置１２１乃至１２３などのデータ記憶装置内に記憶され、そこから要求に応じて情報がオペレーティング・システムによりメモリ内にページングされることが理解されよう。
【００１９】
一般に、本発明の図示の実施例を実現するために実行されるルーチンは、それがオペレーティング・システムまたは特定のアプリケーション、プログラム、オブジェクト、モジュールまたは命令のシーケンスの一部として実現されるかに関わらず、ここでは"コンピュータ・プログラム"と称される。コンピュータ・プログラムは通常、命令から構成され、命令が本発明に従うコンピュータ・システム内のデバイスまたはシステム内の１つ以上のプロセッサにより実行されて、これらのデバイスまたはシステムに対して本発明の様々な態様を実現するステップを実行するように、または要素を生成するように指示する。更に、本発明は完全機能型のコンピュータ・システムの状況で述べられるが、本発明の様々な実施例は、様々な形態のプログラム、プログラム製品として配布されることも可能であり、また本発明は配布を行うために使用される特定のタイプの信号担持媒体に関わらず、同様に適用可能である。こうした信号担持媒体の例には、揮発性メモリ素子及び不揮発性メモリ素子、フロッピー（Ｒ）ディスク、ハード・ディスク・ドライブ、ＣＤ−ＲＯＭ、ＤＶＤ、磁気テープなどの記録型媒体と、無線通信リンクを含むデジタル通信リンク及びアナログ通信リンクなどの伝送型媒体とが含まれる。信号担持媒体の例が、図１ではＤＡＳＤ１２１乃至１２３及びメモリ１０２として示される。
【００２０】
リンク・リスト構造：外部インタフェース
好適な実施例では、関連ソフトウェア・データ構造及びプログラミング・コードが、オブジェクト指向（ＯＯ）プログラミング技法を用いて作成されるが、従来の手続き型プログラミングまたは他のプログラミング技法も使用可能である。以下の説明では、ＯＯ技法が使用されるが、一般に他のプログラミング技法において使用される類似のデータ構造、コード・セグメント、または他のエンティティが存在することが理解されよう。リンク・データ構造２１０乃至２１２は、SharedList（共用リスト）と呼ばれるオブジェクトである。
【００２１】
SharedListオブジェクトは、クライアント・オブジェクトの２重リンク・リストを保持する手段を提供するが、幾つかの固有の特性を有する。すなわち、（ａ）リンクがリストに追加されているとき、またはリストから削除されているとき、クライアントが安全にリストをトラバースでき、また、（ｂ）複数クライアントが独立に且つ同時に、リンクをリストに追加したり、リストから削除することができる。SharedListオブジェクトは、全てのクライアントがリストを同時にアクセスすることを可能にする。これはリンク・レベルでのタスクのブロッキングを提供し、個々のリンク競合に関わるタスクだけがブロッキングに関わる。
【００２２】
SharedList<T>オブジェクト：
図３を参照すると、リンク・リスト・データ構造２１０のハイレベル図が示され、ここではSharedList<T>クラスが、任意のタイプＴのクライアント・オブジェクトのSharedListのためのテンプレート式サポートを提供する。SharedList<T>オブジェクト３０１は、リスト内の最初のクライアント・リンク・オブジェクト３０２及び最後のクライアント・リンク・オブジェクト３０３を指し示すポインタと、リスト内のリンクの数のカウントとを含む。更に、各リンク内の順方向ポインタ及び逆方向ポインタのオフセットが含まれ、リンク・オブジェクトはこれらのポインタのフィールドを定義する責任を担う。
【００２３】
更に、各リンクは任意的に、SharedList<T>オブジェクトそのものを指し示すフィールドを定義し得る。このフィールドが定義される場合、リンクがリストに挿入されるとき、ポインタがセットされ、またリンクが削除されるとき、ポインタがNULLにリセットされる。アプリケーションに応じてクライアントはポインタを用いて、このフィールドに問い合わせることにより所与のリンクがリスト内に存在するか否か、及びそれがどのリストに含まれるかを判断する。例えば、クライアント・オブジェクトのデストラクタは、オブジェクトがどのリストに含まれていようと、そのリストからオブジェクトを削除しようとするであろう。
【００２４】
図３は、SharedList<T>オブジェクトが表示される様子を示す。SharedList<T>オブジェクトを指し示す、リンク・オブジェクト内の任意のフィールドのオフセットは、符号付き整数である。リンク内のポインタ・フィールドの不在は、オフセット・フィールド内の負の値により示される。
【００２５】
SharedList<T>機能：
次に、SharedList<T>オブジェクト３０１によりサポートされる基本機能について述べる。
【００２６】
void insertFirst(T*newLink)：
この機能は指定リンクをリスト内の最初のリンクとして挿入する。
【００２７】
void insertLast(T*newLink)：
この機能は指定リンクをリスト内の最後のリンクとして挿入する。
【００２８】
void insertBeforeArbitraryLink(T*newLink,T*refLink)：
この機能は指定リンクを参照される任意のリンクの直前に挿入する。任意のリンクは、クライアントがリスト内に存在することを元来知る及び保証するリンクであり、リスト内の任意の位置を取り得る。ここで述べるように、リンクの挿入ポイントまたは削除されるリンクを突き止めるために、リンクをトラバースすることが可能であるが、クライアントがリストの中央にあるリンクを指し示すポインタを有すると仮定すると、リストの中央までジャンプし、任意のリンクを挿入または削除することも可能である。insertBeforeArbitraryLink機能は、クライアントがこうしたポインタを有する場合に使用されるものの１つである。クライアント（または他の外部エージェンシ）は、結果が予測不能でないならば、リンクが実際にリスト内にあることを保証する責任がある。
【００２９】
void insertAfterArbitraryLink(T*newLink,T*refLink)：
この機能は指定リンクを、参照される任意のリンクの直後に挿入する。
【００３０】
T*removeFirstLink()：
この機能は最初のリンクをリストから削除し、それを指し示すポインタを戻す。
【００３１】
T*removeLastLink()：
この機能は最後のリンクをリストから削除し、それを指し示すポインタを戻す。この機能はリストのアトミック・ビューを要求し（後述）、従って、一部のアプリケーションで所望されるよりも限定的である。
【００３２】
void removeArbitraryLink(T*oldLink)：
この機能は指定された任意のリンクをリストから削除する。
【００３３】
T*removeBeforeArbitraryLink(T*refLink)：
この機能は、指定された任意のリンクの直前のリンクをリストから削除し、それを指し示すポインタを戻す。この機能はリストのアトミック・ビューを要求する。
【００３４】
T*removeAfterArbitraryLink(T*refLink)：
この機能は、指定された任意のリンクの直後のリンクをリストから削除し、それを指し示すポインタを戻す。
【００３５】
getLinkCount()const：
この機能はリスト上のリンクのカウントのスナップショットを戻す。これは同期無しに戻される。
【００３６】
以下の機能は特定のリンクに関与する。すなわち、これらはクライアントが既にリンクを参照しているが、必ずしもSharedList<T>オブジェクト３０１を参照していないことを想定する。
【００３７】
LinkStatus getLinkStatus(const T*refLink)const：
この機能は指定リンクのステータスを戻す。リンクがそれらを含むSharedList<T>オブジェクトを指し示す定義フィールドを有する場合、この機能は指定リンクがリスト内に存在するか否かを示す。リンクが定義ポインタ・フィールドを有さない場合、この機能は単に、リンクがリスト内に存在するか否かが分からないことを示す。
【００３８】
static LinkStatus getLinkStatus(const T*refLink,int32 offset) const：
これは指定リンクのステータスを戻す静的機能である。指定オフセットが負の場合、この機能は、リンクがSharedList<T>オブジェクト内に存在するか否かが分からないことを示す指示を戻す。指定オフセットが負でない場合、この機能は、リンクがあるSharedList<T>オブジェクト内に存在か否かを示す指示を戻す。
【００３９】
static SharedList<T>* getSharedList(const T*refLink,int32 offset)：
これは指定リンクを含むSharedList<T>オブジェクトを指し示すポインタを戻す静的機能である。指定オフセットが負の場合、またはリンクがSharedList<T>オブジェクト内に存在しない場合、NULLポインタが戻される。
【００４０】
static SharedList<T>* removeArbitraryLink(T*refLink,int32 offset)：
これは指定リンクをそれが存在するSharedList<T>オブジェクトから削除し、ポインタをそのSharedList<T>オブジェクトに戻す静的機能である。指定オフセットが負の場合、またはリンクがSharedList<T>オブジェクト内に存在しなかった場合、NULLポインタが戻される（リンクは削除されない）。
【００４１】
リンクを挿入または削除する前記の全ての機能は、機能を実際に実行するための様々な形態のイテレータ・オブジェクトを作成する。クライアントはイテレータ・オブジェクトを用いてこれらの及び他の機能を実行する。前述の機能に加え、特殊化されたアプリケーションのために、様々な２次機能が定義され得る。但し、これらについてはここでは述べない。前記の機能のリストは１実施例として述べただけで、他の及び追加の機能も本発明に従い定義され得る。
【００４２】
SharedListIterator<T>オブジェクト：
SharedListIterator<T>オブジェクト４０１は、SharedList<T>オブジェクト３０１のリンクをトラバース（"ウォーク・スルー"）し、リンクをリストに挿入または削除する能力を提供する。様々なタイプのSharedListIterator<T>オブジェクトが存在し、これらがインヘリタンス階層内で整列される。トラバースによりリストをインスペクト（検査）するだけのイテレータ及びリストのトラバースに加え、（リンクを挿入または削除することにより）リストを変更（ミューテート）できるイテレータが存在する。またリストの非アトミック・ビューを有するイテレータ、更にアトミック・ビューを有するイテレータが存在する。リストを操作するためにクライアントは所望のタイプのイテレータを作成し、次にそれが提供する機能を呼び出す。
【００４３】
ここで使用されるように、アトミック・ビューは、他のミューテータが同時にリストを変更しようとしないように、イテレータが保証されることを意味する。すなわち、イテレータは排他アクセスの形式を有する。但しイテレータは、インスペクタが同時にリストをアクセスすることを許可してもよい。非アトミック・ビューは、こうした保証がないことを意味する。本発明の要点は、リンク・リストの異なる部分の同時変更を可能にすることであり、従って、非アトミック・ビューが奨励される。しかしながら、ある形態の排他性が必要とされる特殊な環境が存在してもよく、従って、その効果において、従来のロッキング方法と類似するアトミック・ビューが提供される。
【００４４】
イテレータ・ステータス：
イテレータは次の状態の１つにおいて存在する。
【００４５】
非アクティブ状態：
これはイテレータが作成されるときの、その初期状態である。この状態では、イテレータはリスト資源を保持せず、現リンクに関して知らない。イテレータはリストとの関係が無くなるとき、この状態に戻らなければならない（或いは消滅されるとき、暗黙的にこの状態に戻される）。
【００４６】
アクティブ状態：
これはイテレータがリスト資源を有し、現リンクに関して知るときのイテレータの状態である。イテレータは一般に、getFirstLink()（またはgetLinkAfterArbitraryLink()）メソッドの実行の結果としてのみ、この状態に達する。しかしながら、後述のように、イテレータをアクティブ状態に移行可能な幾つかのミューテータ機能が存在する。
【００４７】
遷移：
この状態はミューテータにだけ当てはまる。この状態では、ミューテータはもはや現リンクに関して知らないが、まだリスト資源を保持している。このために、ミューテータはこの状態に達するとき、単独で取り残されるべきでない。リストの終わりにおいて、insertBeforeCurrentLink()機能を成功させようとする試みが成される。
【００４８】
オブジェクト階層：
図４乃至図６は、外部的に見たオブジェクト・クラス・インヘリタンス階層、及びSharedListIterator<T>オブジェクト・クラス４０１から継承される各クラスによりサポートされる機能を示す。これらのオブジェクト・クラスは次のようである。
【００４９】
SharedListIterator<T>４０１：
これはインヘリタンス階層内の最高クラスであり、単なる抽象基本クラス（abstract base class）である。これはリストを順方向にウォーク・スルーし、一度に１リンクを参照する能力を提供する。これがリストをミューテートする能力を有するか、それともリストをインスペクトすなわち検査するだけの能力を有するかが、導出されるクラスにより決定される。これはまた、導出クラスにより提供される、リストのアトミック・ビューまたは非アトミック・ビューのいずれかを有する。
【００５０】
SharedListInspector<T>４０２：
このクラスはSharedListIterator<T>４０１から派生する。これも抽象クラス（abstract class）であり、イテレータ以上のものではないが、リストをミューテートしないことを約束する。これは導出クラスにより提供される、リストのアトミック・ビューまたは非アトミック・ビューのいずれかを有する。
【００５１】
SharedListAtomicInspector<T>４０４：
これはSharedListInspector<T>４０２から派生する具象クラス（concrete class）である。このクラスのオブジェクトはリストのアトミック・ビューを有し、このことは、どのミューテータもリストを処理していないことを確実視できることを意味する。このクラスのオブジェクトは、リストを通じて（順方向または逆方向に）反復できるが、それをミューテートすることはできない。
【００５２】
SharedListNonatomicInspector<T>４０５：
これはSharedListInspector<T>４０２から派生する具象クラスである。このクラスのオブジェクトはリストの非アトミック・ビューを有し、このことは、ミューテータがリストを同時に処理しているかもしれないことを意味する。このクラスのオブジェクトは、リストを通じて順方向に反復できるが、それをミューテートすることはできない。
【００５３】
SharedListMutator<T>４０３：
このクラスはSharedListIterator<T>４０１から派生する。これも抽象クラスであるが、これはリンクをリストに挿入することにより、またはリンクをリストから削除することによりリストをミューテートする能力を追加する。これは導出クラスにより提供される、リストのアトミック・ビューまたは非アトミック・ビューのいずれかである。
【００５４】
SharedListAtomicMutator<T>４０７：
これはSharedListMutator<T>４０３から派生する具象クラスである。このクラスのオブジェクトはリストのアトミック・ビューを有し、このことは、他のどのミューテータもリストを処理していないことを確実視できることを意味する。このクラスのオブジェクトは、リストを通じて順方向または逆方向に反復でき、リストをミューテートできる。
【００５５】
SharedListNonatomicMutator<T>４０６：
これはSharedListMutator<T>４０３から派生する具象クラスである。このクラスのオブジェクトはリストの非アトミック・ビューを有し、このことは、他の非アトミック・ミューテータがリストを同時に処理しているかもしれないことを意味する。このクラスのオブジェクトは、リストを通じて順方向に反復でき、リンクをリストに挿入したり、リンクをリストから削除することができる。
【００５６】
SharedListIterator<T>オブジェクト：
イテレータはリスト内のリンクを"ウォーク・スルー"する能力を有する。アクティブ状態または遷移状態では、これらは現在参照しているリンクである現リンクを有する。インスペクタは、その現リンクがリストから削除され得ないことを保証される。ミューテータは、他のどのミューテータもその現リンクまたはそれに先行するリンクを削除できないこと、及び別のリンクをそれらの間に挿入できないことを保証される。
【００５７】
次の機能は、全てのタイプの全てのイテレータに対して、抽象基本クラス上で提供される。
【００５８】
T*getFirstLink()：
この機能はイテレータの現リンクをリスト内の最初のリンクにセットし、それを指し示すポインタを戻す。この機能を呼び出した結果、イテレータはアクティブ状態になる。しかしながら、リスト内にリンクが存在しない場合には、戻されるポインタはNULLであり、イテレータがインスペクタの場合、イテレータは非アクティブ状態であり、ミューテータの場合、イテレータは遷移状態である。
【００５９】
T*getLinkAfterArbitraryLink(T*refLink)：
この機能はイテレータの現リンクを、指定された任意のリンクの直後のリンクにセットし、それを指し示すポインタを戻す。この機能を呼び出した結果、イテレータはアクティブ状態になる。しかしながら、指定された任意のリンクに続くリンクが存在しない場合、戻されるポインタはNULLであり、イテレータがインスペクタの場合、イテレータは非アクティブ状態であり、ミューテータの場合、イテレータは遷移状態である。
【００６０】
T*getNextLink()：
この機能はイテレータを、リスト内の次のリンクに進める。これはその現リンクをリスト内の次のリンクにセットし、それを指し示すポインタを戻す。しかしながら、実際の結果は、この機能が呼び出される前のイテレータの状態に依存する。イテレータがアクティブ状態で、リストの終わりに達していない場合、イテレータはアクティブ状態のままである。イテレータがアクティブ状態で、リストの終わりに達している場合には、それがインスペクタであれば、イテレータは非アクティブ状態に移行する。イテレータがミューテータの場合には、イテレータは遷移状態に移行する。いずれの場合にもNULLポインタが戻される。イテレータが遷移状態の場合、イテレータは非アクティブ状態に移行し、NULLポインタが戻される。イテレータが非アクティブ状態の場合には、イテレータは非アクティブ状態を維持し、NULLポインタが戻される。
【００６１】
T*getCurrentLink()：
この機能は、イテレータの現リンクを指し示すポインタを戻す。一般に、この機能は単に、他の"getLink"機能のいずれかの最も最近の呼び出しにより戻された値と同一の値を戻す。しかしながら、ミューテータの現リンクを変更させる幾つかのミューテータ機能が存在する。そして、こうした機能の結果が、ミューテータの現リンクが変更されたことを示す場合、この機能は新たな現リンクを獲得するために呼び出されるべきである。
【００６２】
void reset()：
この機能はイテレータを非アクティブ状態に移行する。これはイテレータのデストラクタが実行されるとき、自動的に呼び出されるが、クライアントによっても、例えばミューテータを遷移状態から移行するために呼び出される。
【００６３】
IteratorState getState()const：
この機能はイテレータの現状態（アクティブ状態、非アクティブ状態または遷移状態）を戻す。
【００６４】
getLinkCount()const：
この機能はリスト内のリンクの数のスナップショットを戻す。
【００６５】
constructor：
導出される全ての具象クラスのコンストラクタは、イテレータが関連付けられるSharedList<T>オブジェクト３０１の参照を要求する。更に、コンストラクタは任意のパラメータとして、SharedList<T>オブジェクトに対するイテレータのロック範囲の指示をサポートする。ロックはSharedListIterator<T>オブジェクトの存在期間中有効であるか、イテレータがアクティブ状態または遷移状態の間だけ、または（イテレータがミューテータの場合）ミューテート機能を実行している間だけ有効となるように動的であってもよい。動的オプションによりイテレータはそれが未使用の間に、SharedList<T>オブジェクトに対するロックを保持することなく存在できる。これはイテレータを繰り返し作成及び消滅するオーバヘッドが余りに多い場合に有用である。デフォルト指定では、ロックの有効期間はイテレータの寿命に及ぶ。
【００６６】
destructor：
導出される全ての具象クラスのデストラクタは、イテレータが非アクティブ状態にリセットされるように保証する。
【００６７】
SharedListInspector<T>オブジェクト：
この抽象クラスは、SharedListIterator<T>基本クラスにより提供される機能を越える追加の機能を提供しない。このクラスから派生するクラスのオブジェクトはリストをインスペクトできるが、ミューテートできないことが知られている。
【００６８】
SharedListAtomicInspector<T>オブジェクト：
これはSharedListInspector<T>４０２から派生する具象クラスである。このクラスのオブジェクトは、リストのアトミック・ビューを有する。このクラスのオブジェクトは、リストを通じて順方向または逆方向のいずれかに反復できるが、リストをミューテートできない。
【００６９】
アトミック・ビューにより、このクラスはまた次の機能を提供する。
【００７０】
T*getLastLink()：
この機能は、リスト内の最後のリンクを指し示すポインタを戻す。リスト内にリンクが存在しない場合を除き、この機能が呼び出された後、インスペクタはアクティブ状態となる。リスト内にリンクが存在しない場合には、NULLポインタが戻され、インスペクタは非アクティブ状態となる。
【００７１】
T*getPrevLink()：
この機能は、イテレータをリスト内の前のリンクにバックアップすなわち後退させる。これはその現リンクをリスト内の前のリンクにセットし、それを指し示すポインタを戻す。しかしながら、実際の結果は、機能が呼び出される前のインスペクタの状態に依存する。インスペクタがアクティブ状態でリストの先頭に達していない場合、インスペクタはアクティブ状態のままでいる。インスペクタがアクティブ状態でリストの先頭に達している場合、インスペクタは非アクティブ状態に移行し、NULLポインタが戻される。インスペクタが非アクティブ状態の場合、インスペクタは非アクティブ状態のままであり、NULLポインタが戻される。
【００７２】
SharedListNonatomicInspector<T>オブジェクト：
これはSharedListInspector<T>４０２から派生する具象クラス（concrete class）である。これは基本クラスの他には機能を提供しない。このクラスのオブジェクトは、リストの非アトミック・ビューを有する。このクラスのオブジェクトは、リストを通じて前方に反復できるが、リストを自身ではミューテートできない。
【００７３】
SharedListMutator<T>オブジェクト：
この抽象クラスはSharedListIterator<T>４０１から派生する。これはリストにリンクを追加することにより、或いはリストからリンクを削除することにより、リストをミューテートする能力を追加する。これはそこから派生するクラスにより提供される、リストのアトミック・ビューまたは非アトミック・ビューのいずれを有する。
【００７４】
ミューテート機能を呼び出すとき、クライアントのミューテータは任意の状態であってよい。この機能の実際の実行の間、ミューテータは一般に、（少なくとも内部的には）非アクティブ状態でなければならない。アクティブ状態または遷移状態のミューテータが、ミューテート機能を通じてリスト内でその場所を確保するためにこの機能の完了は、後に状態をリストアする能力を有さなければならない。より一般的には、全てのミューテート機能は、その機能の完了時にミューテータの現リンク（及び従ってその状態）がどのように処理されるかを示すMutatorControlパラメータを含む。次に示す値が指定される。
【００７５】
conditionalUpdate=0：
この値はミューテータの現リンクが変更されないことを示す。但し、機能を完了するために変更が必要な場合を除く。現リンクが変更される場合、ミューテータはリスト内でその場所を失わない。すなわち、新たな現リンクは、旧現リンクに先行したリンクに続くリンクである。アトミック・ミューテータの現リンクは、それがたまたま削除されつつあるリンクの場合に限り変更される。非アトミック・ミューテータの現リンクは、insertAfterCurrentLink()及びremoveAfterCurrentLink()を除く、全てのミューテート機能により変更される。
【００７６】
unconditionalUpdate=1：
この値は、機能が成功する場合に、ミューテータの現リンクが変更されることを示す。リンクを挿入する場合、新たな現リンクは新たに挿入されるリンクである。また、リンクを削除する場合、新たな現リンクは削除されたリンクに続くリンクである。
【００７７】
unconditionalReset=2：
この値は、機能が成功する場合に、ミューテータが非アクティブ状態にリセットされることを示す。
【００７８】
様々な挿入機能及び削除機能がMutatorResult値を戻し、これは機能が成功したかまたは失敗したか、及び現リンクが変更されたかを示す。次に示す値が戻される。
【００７９】
successfulAsRequested=0：
この値は要求機能が成功したこと、並びにミューテータの現リンクがMutatorControl値による指定に従い、変更されなかったか、無条件に更新されたか、またはミューテータが無条件にリセットされたことを示す。
【００８０】
failedNoChange=1：
この値は要求機能が失敗したこと、並びにミューテータの現リンクが変更されなかったことを示す。この条件はまたユーザ・エラーの結果でもある。
【００８１】
successfulWithChange=2：
この値は要求機能が成功したが、ミューテータの現リンクが変更されなければならなかったことを示す。これはconditionalUpdateがMutatorControl値に対して指定されるときだけ戻される。この場合、アクティブ状態または遷移状態であった非アトミック・ミューテータに対して戻されるか、たまたまその現リンクであったリンクを削除するアトミック・ミューテータに対して戻される。
【００８２】
failedWithChange=3：
この値は、要求機能が失敗し、デッドロックを回避するためにミューテータの現リンクが変更されなければならなかったことを示す。これは非アトミック・ミューテータに対してだけ発生し得、指定されるMutatorControl値には関係無しに起こり得る。しかしながら、ミューテータはリスト内でのその場所を失うことになる。新たな現リンクは、旧現リンクに先行したリンクに続くリンクである。
【００８３】
クライアントは戻されるMutatorResultを前記指定値と比較するか、それをマスクとして扱い、その中の個々のビットをテストする。個々のビットの意味は次のようである。
【００８４】
failed=0x01：
機能が失敗した場合、このビットはオンであり、機能が成功した場合はオフである。
【００８５】
changed=0x02：
ミューテータの現リンクが予期せずに変更された場合、このビットはオンである。オフの場合には、ミューテータの現リンクを変更することなく、機能が失敗したか、或いは機能が成功したことを示すが、MutatorControl値が無条件の更新またはリセットを要求した場合にだけ、ミューテータの現リンクを変更する。
【００８６】
SharedListMutator<T>クラス４０３は、次の機能を提供する。各機能はMutatorControlパラメータを要求し、MutatorResult値またはパラメータを戻すか更新する。
【００８７】
T*removeFirstLink(MutatorControl,MutatorResult&)：
このメソッドは最初のリンクをリストから削除し、それを指し示すポインタを戻す。リスト内にリンクが存在しない場合、NULLが戻される。MutatorResultパラメータが機能が成功したか否か及びミューテータの現リンクに対するその影響を示すように更新される。表１は、様々なMutatorResult値が戻される状況を示す。
【００８８】
T*removeAfterArbitraryLink(T*refLink,MutatorControl,MutatorResult&)：
このメソッドは、指定された任意のリンクの続くリンクをリストから削除し、それを指し示すポインタを戻す。指定された任意のリンクがリスト内の最後のリンクの場合、NULLが戻される。MutatorResultパラメータが機能が成功したか否か及びミューテータの現リンクに対するその影響を示すように更新される。表１は、様々なMutatorResult値が戻される状況を示す。
【表１】
選択された削除機能のMutatorResult値：
[MutatorControl]
0=ConditionalUpdate
[アトミック・ミューテータ]
0=successfulAsRequested
削除されたリンクは現リンクではなかった。現リンクが変更されていない。
1=failedWithoutChange
参照された任意のリンクがNULLか、または削除するリンクが存在しなかった。
2=successfulWithChange
削除されたリンクが旧現リンクであった。現リンクはそれに続くリンクに変更されている。
[非アトミック・ミューテータ]
0=successfulAsRequested
ミューテータが非アクティブ状態で、その状態を維持している。
1=failedWithoutChange
ａ）参照された任意のリンクがNULLか、または、ｂ）ミューテータが非アクティブ状態で削除するリンクが存在しなかった。
2=successfulWithChange
ミューテータがアクティブまたは遷移状態であった。現リンクは、削除されたリンクに続くリンクに変更されている。
3=failedWithChange
ミューテータがアクティブ状態または遷移状態で、削除するリンクが存在しなかった。ミューテータは現在遷移状態である。
[MutatorControl]
1=UnconditionalUpdate
[アトミック・ミューテータ]
0=successfulAsRequested
現リンクが現在、削除されたリンクに続くリンクである。
1=failedWithoutChange
参照された任意のリンクがNULLか、または削除するリンクが存在しなかった。
[非アトミック・ミューテータ]
0=successfulAsRequested
現リンクが現在、削除されたリンクに続くリンクである。
1=failedWithoutChange
ａ）参照された任意のリンクがNULLか、または、ｂ）ミューテータが非アクティブ状態で削除するリンクが存在しなかった。
3=failedWithChange
ミューテータがアクティブ状態または遷移状態で、削除するリンクが存在しなかった。ミューテータは現在遷移状態である。
[MutatorControl]
2=UnconditionalReset
[アトミック・ミューテータ]
0=successfulAsRequested
ミューテータが非アクティブ状態にリセットされた。
1=failedWithoutChange
参照された任意のリンクがNULLか、または削除するリンクが存在しなかった。
[非アトミック・ミューテータ]
0=successfulAsRequested
ミューテータが非アクティブ状態にリセットされた。
1=failedWithoutChange
ａ）参照された任意のリンクがNULLか、または、ｂ）ミューテータが非アクティブ状態で削除するリンクが存在しなかった。
3=failedWithChange
ミューテータがアクティブ状態または遷移状態で、削除するリンクが存在しなかった。ミューテータは現在遷移状態である。
尚、この表のアトミック・ミューテータ部分は、removeLastLink()及びremoveBeforeArbitraryLink()機能にも当てはまる。
【００８９】
MutatorResult removeArbitraryLink(T*oldLink,MutatorControl)：
このメソッドは指定の任意のリンクをリストから削除し、機能が成功したか否か、及びミューテータの現リンクに対するその影響を示す結果を戻す。表２は、様々なMutatorResult値が戻される状況を示す。
【表２】
removeArbitraryLink()機能のMutatorResult値：
[MutatorControl]
0=ConditionalUpdate
[アトミック・ミューテータ]
0=successfulAsRequested
削除されたリンクは現リンクではなかった。現リンクが変更されていない。
1=failedWithoutChange
参照された任意のリンクがNULLであった。
2=successfulWithChange
削除されたリンクが旧現リンクであった。現リンクはそれに続くリンクに変更されている。
[非アトミック・ミューテータ]
0=successfulAsRequested
ミューテータが非アクティブ状態で、その状態を維持している。
1=failedWithoutChange
参照された任意のリンクがNULLであった。
2=successfulWithChange
ミューテータがアクティブまたは遷移状態であった。現リンクは、削除されたリンクに続くリンクに変更されている。
[MutatorControl]
1=UnconditionalUpdate
[アトミック・ミューテータ]
0=successfulAsRequested
現リンクが現在、削除されたリンクに続くリンクである。
1=failedWithoutChange
参照された任意のリンクがNULLであった。
[非アトミック・ミューテータ]
0=successfulAsRequested
現リンクが現在、削除されたリンクに続くリンクである。
1=failedWithoutChange
参照された任意のリンクがNULLであった。
[MutatorControl]
2=UnconditionalReset
[アトミック・ミューテータ]
0=successfulAsRequested
ミューテータが非アクティブ状態にリセットされた。
1=failedWithoutChange
参照された任意のリンクがNULLであった。
[非アトミック・ミューテータ]
0=successfulAsRequested
ミューテータが非アクティブ状態にリセットされた。
1=failedWithoutChange
参照された任意のリンクがNULLであった。
【００９０】
MutatorResult removeCurrentLink(MutatorControl)：
このメソッドは、ミューテータの現リンクをリストから削除しようとする。機能は成功するかもしれないし、そうでないかもしれない。成功しない場合、それは別のミューテータがこのミューテータの現リンクの前にリンクを挿入するようにコミットしたか、またはこのミューテータの現リンクを削除するようにコミットしたことによる。機能が成功するか否かに関わらず、ミューテータは新たな現リンクを有する。新たな現リンクは、削除が試行されたときの現リンクに先行したリンクに続くリンクである。このように、ミューテータはリスト内でその場所を失わない。機能はその機能が成功したか否か、及びミューテータの現リンクに対するその影響を示す結果を戻す。表３は、様々なMutatorResult値が戻される状況を示す。
【表３】
removeCurrentLink()機能のMutatorResult値：
[MutatorControl]
0=ConditionalUpdate
[アトミック・ミューテータ]
1=failedWithoutChange
ミューテータがアクティブ状態でなかった。
2=successfulWithChange
現リンクが現在、削除された現リンクに続くリンクである。
[非アトミック・ミューテータ]
1=failedWithoutChange
ミューテータがアクティブ状態でなかった。
2=successfulWithChange
現リンクが現在、削除された現リンクに続くリンクである。
3=failedWithChange
現リンクが、削除が試行されたときの現リンクに先行するリンクに続くリンクである。
[MutatorControl]
1=UnconditionalUpdate
[アトミック・ミューテータ]
0=successfulAsRequested
現リンクが現在、削除された現リンクに続くリンクである。
1=failedWithoutChange
ミューテータがアクティブ状態でなかった。
[非アトミック・ミューテータ]
0=successfulAsRequested
現リンクが現在、削除されたリンクに続くリンクである。
1=failedWithoutChange
ミューテータがアクティブ状態でなかった。
3=failedWithChange
現リンクが、削除が試行されたときの現リンクに先行するリンクに続くリンクである。
[MutatorControl]
2=UnconditionalReset
[アトミック・ミューテータ]
0=successfulAsRequested
ミューテータが非アクティブ状態にリセットされた。
1=failedWithoutChange
ミューテータがアクティブ状態でなかった。
[非アトミック・ミューテータ]
0=successfulAsRequested
ミューテータが非アクティブ状態にリセットされた。
1=failedWithoutChange
ミューテータがアクティブ状態でなかった。
3=failedWithChange
現リンクが、削除が試行されたときの現リンクに先行するリンクに続くリンクである。
【００９１】
T*removeAfterCurrentLink(MutatorControl,MutatorResult&)：
この機能は、現リンクの直後のリンクを削除しようと試み、それを指し示すポインタを戻す。現リンクがリスト内の最後のリンクの場合、NULLが戻される。この機能は成功するかもしれないし、そうでないかもしれない。成功しない場合、それは別のミューテータがこのミューテータの現リンクを削除するようにコミットしたことによる。この場合、このミューテータは新たな現リンクを有し、それは削除が試行されたときに、旧現リンクに先行したリンクに続くリンクである。このように、ミューテータはリスト内でその場所を失わない。MutatorResultは、機能が成功したか否か、及びミューテータの現リンクに対するその影響を示すように更新される。表４は、様々なMutatorResult値が戻される状況を示す。
【表４】
removeAfterCurrentLink()機能のMutatorResult値：
[MutatorControl]
0=ConditionalUpdate
[アトミック・ミューテータ]
0=successfulAsRequested
現リンクが変更されていない。
1=failedWithoutChange
現リンクが最後のリンクであったか、ミューテータがアクティブ状態でなかった。
[非アトミック・ミューテータ]
0=successfulAsRequested
現リンクが変更されていない。
1=failedWithoutChange
現リンクが最後のリンクであったか、ミューテータがアクティブ状態でなかった。
3=failedWithChange
新たな現リンクが、削除が試行されたときの旧現リンクに先行するリンクに続くリンクである。
[MutatorControl]
1=UnconditionalUpdate
[アトミック・ミューテータ]
0=successfulAsRequested
現リンクが、削除されたリンクに続くリンクである。
1=failedWithoutChange
現リンクが最後のリンクであったか、ミューテータが非アクティブ状態であった。
[非アトミック・ミューテータ]
0=successfulAsRequested
現リンクが、削除されたリンクに続くリンクである。
1=failedWithoutChange
現リンクが最後のリンクであったか、ミューテータがアクティブ状態でなかった。
3=failedWithChange
新たな現リンクが、削除が試行されたときの旧現リンクに先行するリンクに続くリンクである。
[MutatorControl]
2=UnconditionalUpdate
[アトミック・ミューテータ]
0=successfulAsRequested
ミューテータが非アクティブ状態にリセットされた。
1=failedWithoutChange
現リンクが最後のリンクであったか、ミューテータが非アクティブ状態であった。
[非アトミック・ミューテータ]
0=successfulAsRequested
ミューテータが非アクティブ状態にリセットされた。
1=failedWithoutChange
現リンクが最後のリンクであったか、ミューテータがアクティブ状態でなかった。
3=failedWithChange
新たな現リンクが、削除が試行されたときの旧現リンクに先行するリンクに続くリンクである。
【００９２】
MutatorResult insertFirst(T*newLink,MutatorControl)：
この機能は指定リンクをリストの先頭に挿入し、ミューテータの現リンクに対するその影響を示す結果を戻す。表５は、様々なMutatorResult値が戻される状況を示す。
【００９３】
MutatorResult insertLast(T*newLink,MutatorControl)：
この機能は指定リンクをリストの終わりに挿入し、ミューテータの現リンクに対するその影響を示す結果を戻す。表５は、様々なMutatorResult値が戻される状況を示す。
【００９４】
MutatorResult insertBeforeArbitraryLink(T*newLink,T*refLink,MutatorControl)：
このメソッドは指定リンクを、指定参照リンクの直前に挿入し、ミューテータの現リンクに対するその影響を示す結果を戻す。表５は、様々なMutatorResult値が戻される状況を示す。
【００９５】
MutatorResult insertAfterArbitraryLink(T*newLink,T*refLink,MutatorControl)：
このメソッドは指定リンクを指定参照リンクの直後に挿入し、ミューテータの現リンクに対するその影響を示す結果を戻す。表５は、様々なMutatorResult値が戻される状況を示す。
【表５】
選択挿入機能のMutatorResult値：
[MutatorControl]
0=ConditionalUpdate
[アトミック・ミューテータ]
0=successfulAsRequested
現リンクが変更されていない。
1=failedWithoutChange
挿入されるリンク、または参照される任意のリンクがNULLであった。
[非アトミック・ミューテータ]
0=successfulAsRequested
ミューテータが非アクティブ状態で、その状態を維持している。
1=failedWithoutChange
挿入されるリンク、または参照される任意のリンクがNULLであった。
2=successfulWithChange
ミューテータがアクティブまたは遷移状態であった。新たに挿入されるリンクが現リンクである。
[MutatorControl]
1=UnconditionalUpdate
[アトミック・ミューテータ]
0=successfulAsRequested
新たに挿入されるリンクが現リンクである。
1=failedWithoutChange
挿入されるリンク、または参照される任意のリンクがNULLであった。
[非アトミック・ミューテータ]
0=successfulAsRequested
新たに挿入されるリンクが現リンクである。
1=failedWithoutChange
挿入されるリンク、または参照される任意のリンクがNULLであった。
[MutatorControl]
2=UnconditionalUpdate
[アトミック・ミューテータ]
0=successfulAsRequested
ミューテータが非アクティブ状態にリセットされた。
1=failedWithoutChange
挿入されるリンク、または参照される任意のリンクがNULLであった。
[非アトミック・ミューテータ]
0=successfulAsRequested
ミューテータが非アクティブ状態にリセットされた。
1=failedWithoutChange
挿入されるリンク、または参照される任意のリンクがNULLであった。
【００９６】
MutatorResult insertBeforeCurrentLink(T*newLink,MutatorControl)：
このメソッドは、ミューテータの現リンクの直前に指定リンクを挿入しようとする。この機能は成功するかもしれないし、そうでないかもしれない。成功しない場合、それは別のミューテータがこのミューテータの現リンクの前に、リンクを挿入するようにコミットしたか、またはこのミューテータの現リンクを削除するようにコミットしたことによる。機能が成功するか否かに関わらず、ミューテータは新たな現リンクを有する。新たな現リンクは、挿入が試行されたときの旧現リンクに先行したリンクに続くリンクである。このように、ミューテータはリスト内でその場所を失わない。戻り値は、その機能が成功したか否か、及びミューテータの現リンクに対するその影響を示す。表６は、様々なMutatorResult値が戻される状況を示す。
【表６】
insertBeforeCurrentLink()機能のMutatorResult値：
[MutatorControl]
0=ConditionalUpdate
[アトミック・ミューテータ]
0=successfulAsRequested
現リンクが変更されていない。
1=failedWithoutChange
挿入されるリンクがNULLか、またはミューテータが非アクティブ状態であった。
[非アトミック・ミューテータ]
0=successfulAsRequested
現リンクが変更されていない。
1=failedWithoutChange
挿入されるリンクがNULLか、またはミューテータが非アクティブ状態であった。
3=failedWithChange
新たな現リンクが、挿入が試行されたときの旧現リンクに先行するリンクに続くリンクである。
[MutatorControl]
1=UnconditionalUpdate
[アトミック・ミューテータ]
0=successfulAsRequested
新たに挿入されるリンクが現リンクである。
1=failedWithoutChange
挿入されるリンクがNULLか、またはミューテータが非アクティブ状態であった。
[非アトミック・ミューテータ]
0=successfulAsRequested
新たに挿入されるリンクが現リンクである。
1=failedWithoutChange
挿入されるリンクがNULLか、またはミューテータが非アクティブ状態であった。
3=failedWithChange
新たな現リンクが、挿入が試行されたときの旧現リンクに先行するリンクに続くリンクである。
[MutatorControl]
2=UnconditionalReset
[アトミック・ミューテータ]
0=successfulAsRequested
ミューテータが非アクティブ状態にリセットされた。
1=failedWithoutChange
挿入されるリンクがNULLか、またはミューテータが非アクティブ状態であった。
[非アトミック・ミューテータ]
0=successfulAsRequested
ミューテータが非アクティブ状態にリセットされた。
1=failedWithoutChange
挿入されるリンクがNULLか、またはミューテータが非アクティブ状態であった。
3=failedWithChange
新たな現リンクが、挿入が試行されたときの旧現リンクに先行するリンクに続くリンクである。
【００９７】
MutatorResult insertAfterCurrentLink(T*newLink,MutatorControl)：
この機能は、現リンクの直後に指定リンクを挿入しようとする。この機能は成功するかもしれないし、そうでないかもしれない。成功しない場合、それは別のミューテータが既に、このミューテータの現リンクを削除するようにコミットしたことによる。この場合、このミューテータは新たな現リンクを有し、この新たな現リンクは、挿入が試行されたときの旧現リンクに先行したリンクに続くリンクである。このように、ミューテータはリスト内でその場所を失わない。戻り値は、その機能が成功したか否か、及びミューテータの現リンクに対するその影響を示す。表７は、様々なMutatorResult値が戻される状況を示す。
【表７】
insertAfterCurrentLink()機能のMutatorResult値：
[MutatorControl]
0=ConditionalUpdate
[アトミック・ミューテータ]
0=successfulAsRequested
現リンクが変更されていない。
1=failedWithoutChange
挿入されるリンクがNULLか、またはミューテータが非アクティブ状態であった。
[非アトミック・ミューテータ]
0=successfulAsRequested
現リンクが変更されていない。
1=failedWithoutChange
挿入されるリンクがNULLか、またはミューテータがアクティブ状態でなかった。
3=failedWithChange
新たな現リンクが、挿入が試行されたときの旧現リンクに先行するリンクに続くリンクである。
[MutatorControl]
1=UnconditionalUpdate
[アトミック・ミューテータ]
0=successfulAsRequested
新たに挿入されるリンクが現リンクである。
1=failedWithoutChange
挿入されるリンクがNULLか、またはミューテータが非アクティブ状態であった。
[非アトミック・ミューテータ]
0=successfulAsRequested
新たに挿入されるリンクが現リンクである。
1=failedWithoutChange
挿入されるリンクがNULLか、またはミューテータがアクティブ状態でなかった。
3=failedWithChange
新たな現リンクが、挿入が試行されたときの旧現リンクに先行するリンクに続くリンクである。
[MutatorControl]
2=UnconditionalReset
[アトミック・ミューテータ]
0=successfulAsRequested
ミューテータが非アクティブ状態にリセットされた。
1=failedWithoutChange
挿入されるリンクがNULLか、またはミューテータが非アクティブ状態であった。
[非アトミック・ミューテータ]
0=successfulAsRequested
ミューテータが非アクティブ状態にリセットされた。
1=failedWithoutChange
挿入されるリンクがNULLか、またはミューテータがアクティブ状態でなかった。
3=failedWithChange
新たな現リンクが、挿入が試行されたときの旧現リンクに先行するリンクに続くリンクである。
【００９８】
SharedListAtomicMutator<T>オブジェクト：
これはSharedListMutator<T>４０３から派生する具象クラスである。このクラスのオブジェクトはリストのアトミック・ビューを有し、このことは、これらのオブジェクトが、他のミューテータがリストを処理していないことを確信できることを意味する。このクラスのオブジェクトは、リストを通じて順方向または逆方向に反復でき、更にリンクをリストに挿入したり、削除することができる。アトミック・ビューにより、このクラスはまた次の機能を提供する。
【００９９】
T*getLastLink()：
この機能は、リスト内の最後のリンクを指し示すポインタを戻す。リスト内にリンクが存在しない場合を除き、この機能が呼び出された後、ミューテータはアクティブ状態となる。リスト内にリンクが存在しない場合には、NULLポインタが戻され、ミューテータは非アクティブ状態となる。
【０１００】
T*getPrevLink()：
この機能は、ミューテータをリスト内の前リンクにバックアップすなわち後退させる。これはその現リンクをリスト内の前リンクにセットし、それを指し示すポインタを戻す。しかしながら、実際の結果は、機能が呼び出される前のミューテータの状態に依存する。ミューテータがアクティブ状態でリストの先頭に達していない場合、ミューテータはアクティブ状態のままでいる。ミューテータが遷移状態でリストの先頭に達していない場合、ミューテータはアクティブ状態に移行する。ミューテータがアクティブ状態または遷移状態で、リストの先頭に達している場合には、ミューテータは非アクティブ状態に移行し、NULLポインタが戻される。ミューテータが非アクティブ状態の場合、ミューテータは非アクティブ状態のままであり、NULLポインタが戻される。
【０１０１】
T*removeLastLink(MutatorControl,MutatorResult&)：
このメソッドは最後のリンクをリストから削除し、それを指し示すポインタを戻す。リスト内にリンクが存在しない場合、NULLが戻される。MutatorResultパラメータが、機能が成功したか否か、及びミューテータの現リンクに対するその影響を示すように更新される。表１は、様々なMutatorResult値が戻される状況を示す。
【０１０２】
T*removeBeforeArbitraryLink(T*refLink,MutatorControl,MutatorResult&)：このメソッドは、指定された任意のリンクの直前のリンクをリストから削除し、それを指し示すポインタを戻す。指定された任意のリンクがリスト内の最初のリンクの場合、NULLが戻される。MutatorResultパラメータが、機能が成功したか否か、及びミューテータの現リンクに対するその影響を示すように更新される。表１は、様々なMutatorResult値が戻される状況を示す。
【０１０３】
SharedListNonatomicMutator<T>オブジェクト：
これはSharedListMutator<T>４０３から派生する具象クラスである。このクラスのオブジェクトは、リストを通じて順方向に反復でき、また同一のクラスの他のオブジェクトがリストをミューテートしている間に、リンクをリストに挿入したり、削除することができる。
【０１０４】
SharedListIterator<T>同時アクセスの概要：
表８は、SharedList<T>オブジェクトを同時にアクセスしようとする２つのイテレータの間で発生する競合をタイプ別にまとめたものである。２つのイテレータがリスト・レベルの競合を有する場合、それらは同時にリストをアクセスすることができない。（リストに対するロックを、自身が存在する期間中有効にするイテレータは、その作成の間、競合するアクセスが解決されるのを待機する。その存在期間中、常にロックを有効にするわけではなく、ロックが動的なイテレータは、それが非アクティブ状態から移行する時点において、またはミューテート機能を開始する時点において待機し、イテレータが非アクティブ状態で且つミューテート機能を実行していなければ、そのロックを解除する。）２つのイテレータがリンク・レベルの競合を有する場合、それらはリストを同時にアクセスすることができるが、同一のリンク・ポインタを参照するときには、順番に行う必要がある。
【表８】
0003738976.tif 000002
【０１０５】
クライアント責任：
SharedList<T>オブジェクトを使用するクライアントは、不正な参照などを回避するために、特定の取り決めを守ることを期待される。すなわち、クライアントはポインタを直接操作するのではなく、定義されたインタフェースを使用するべきである。更に、クライアントはSharedList<T>オブジェクトに関連する機能を呼び出すとき、特定のパラメータの正確性を確認すべきである。例えば、クライアントは、既にリスト内に存在するリンクをリストに挿入すべきでない。こうした可能なアイテムを網羅するリストは、本明細書では取り上げない。
【０１０６】
より重要なクライアント責任の１つは、insertBeforeArbitraryLink()、removeArbitraryLink()などの機能を呼び出すときに渡される任意のリンクの参照が、実際にリスト内にあるリンクの参照であって、操作の間に実際にリンク・リスト内に留まることを保証することである（但し後述のように、ミューテータにより削除される場合を除く）。
【０１０７】
クライアントは、SharedList<T>からそれらのクラスと、適切なイテレータとを導出するか、それらのクラスを自身のクラスによりラッパリング（wrappering）するように選択してもよい。ラッパリングはミューテータ機能のMutatorControlパラメータを隠すために、また露呈されるべきでない機能（例えば任意のリンクを参照する機能など）を隠すために使用される。
【０１０８】
リンク・リスト構造：内部操作：
序論：
SharedChainオブジェクト及びSharedChainIteratorオブジェクト
前述のSharedList<T>オブジェクト及びSharedListIterator<T>オブジェクトは、ここまではクライアントとのインタフェースを提供するが、それらは全ての作業が実行される実オブジェクトを取り巻くラッパ（wrapper）に過ぎない。ラッパ・クラスは、Ｔ*と、リンクを指し示すポインタの内部表現との間のキャスティングにより、テンプレート化を提供する。空の全ての機能は、内部オブジェクトに関するインライン及び単なるコール・アウトライン機能であるので、異なるクライアント・オブジェクトに渡るテンプレート化は、それ程コード・サイズを増加させない。
【０１０９】
内部オブジェクトについては、本願の残りの部分で述べられる。これらはラッパ・オブジェクトと同じ階層内に構成され、同一のインタフェース機能の他に、多くの追加の内部機能をサポートする。ラッパ・クラスの機能の実現は、単に内部クラスに関する対応する機能を呼び出すことである。
【０１１０】
図７乃至図９は、様々な外部クラスと内部クラスとの間の関係、及びそれらのインヘリタンス階層を示す。次の所見を述べることにする。ラッパ・クラス名内の用語"リスト（List）"が、内部クラス内の用語"チェーン（Chain）"すなわち連鎖により置換され、テンプレート化が削除される。イテレータ・クラス階層は、名前の変更を除き同じである。SharedChainItelator基本クラスは、それが属するSharedChainオブジェクトを指し示すポインタを有する。
【０１１１】
ヘルパ・オブジェクト：
SharedChainオブジェクト及びSharedChainIteratorオブジェクトの他に、以下に示す幾つかの内部オブジェクトが使用される。
【０１１２】
SharedChainBlockerオブジェクト：
SharedChainBlockerオブジェクト（単に"ブロッカ・オブジェクト"とも呼ばれる）は、ミューテータにより使用されてリンク・ブロッキング及びアンブロッキング、並びに他の非アトミック・イテレータ（インスペクタ及びミューテータ）との必要な同期を実行する。SharedChainオブジェクトはブロッカ・オブジェクトのプールを保持し、ミューテート機能の期間、それらの１つをミューテータと関連付ける。ブロック・オブジェクト、並びにリンク・ポインタのブロッキング及びアンブロッキングについては、以下で詳述する。
【０１１３】
SharedChainViewオブジェクト：
SharedChainViewクラスは抽象基本クラスである。このクラスから派生するオブジェクトはイテレータにより使用されて、実際のイテレータ機能を実行し、他のミューテータとの同期を行う。この基本クラスから派生する２つのタイプのビュー・オブジェクトが存在し、それらはSharedChainAtomicView及びSharedChainNonatomicViewである。
【０１１４】
SharedChainAtomicView：
このタイプのオブジェクトは、アトミック・イテレータ（インスペクタまたはミューテータ）内で作成される。これはチェーン内のリンクの処置方法を認識し、他のミューテータがリンクを挿入または削除できないことを認識する。SharedChainAtomicViewオブジェクトは極めて単純で、基本的にイテレータの現リンクを指し示すポインタを含む。
【０１１５】
SharedChainNonatomicView：
このタイプのオブジェクト（単に"ビュー・オブジェクト"とも呼ばれる）は、非アトミック・インスペクタ及び非アトミック・ミューテータにより使用される。これはチェーン内のリンクの処置方法を認識し、他のミューテータがリンクを挿入または削除できないことを認識する。SharedChainオブジェクトは、SharedChainNonatomicViewオブジェクトの２つのプールを保持し、一方は非アトミック・インスペクタにより使用され、他は非アトミック・ミューテータにより使用される。これはイテレータがアクティブ状態または遷移状態の間に、ビュー・オブジェクトの１つを非アトミック・イテレータ（インスペクタまたはミューテータ）に関連付ける。非アトミック・ビュー・オブジェクトについては、以下で詳述する。
【０１１６】
ここで示さなかった追加のヘルパ・オブジェクトも、コード・デバッグやシステム性能分析などの追加の２次機能をサポートするために使用可能である。
【０１１７】
動作概要：
SharedChainオブジェクトは、チェーン内の最初のリンクを指し示すポインタと、チェーン内の最後のリンクを指し示すポインタとを保持する。隣接するリンクは、お互いを順方向及び逆方向に指し示す。最後のリスト内の順方向ポインタ、及び最初のリンク内の逆方向ポインタはNULLである。図１０は、３つのリンクを有するSharedChainオブジェクト例を単純化して示した図である。
【０１１８】
アトミック・インスペクタは、リンク・リストを処置するミューテータが存在しないことを確認できるので、リンク・ポインタを順方向及び逆方向に自由に追跡できる。これらはむしろ取るに足らないものとして棄却され、後述するように、アトミック・ミューテータ、非アトミック・ミューテータ、及び非アトミック・インスペクタが取り残される。
【０１１９】
以下では、アトミック・ミューテータについて詳述する。しかしながら、アトミック・ミューテータ（同様にアトミック・インスペクタ）は、特殊オペレーティング・システムをサポートするための下位互換性の理由から、並びに類似の理由から、好適な実施例において提供される。本発明の要点は、できればリスト・レベルのロック機構の使用を回避することであり、本発明を実現する上でアトミック・ミューテータのサポートは必ずしも不可欠ではない。
【０１２０】
非アトミック・イテレータ：
非アトミック・インスペクタはチェーンをトラバースするだけである。これらはチェーンの非アトミック・ビューを有するので、前進中に挿入または削除される特定のリンクに遭遇するか否かは問題ではない。重要な点は、それらがあるリンクから別のリンクに安全に前進でき、また特定のリンクがそれらの現リンクである間に、それがチェーンから削除されないようにすることだけである。
【０１２１】
非アトミック・ミューテータもまたチェーンをトラバースしてよく、非アトミック・インスペクタ同様、あるリンクから次のリンクに安全に前進できなければならず、またそれらの現リンクがチェーンから削除されないことを確認できなければならない。しかしながら、これらは現リンクにもとづきリンクを挿入または削除できるので（例えば、チェーンがある優先順位に維持される）、前リンクが削除されないこと、及び他のリンクがこれらの現リンクと前リンクとの間に挿入されないことが重要である。
【０１２２】
ミューテータ：
リンクを挿入するために、ミューテータは新たなリンク内の順方向ポインタ及び逆方向ポインタをそれぞれ次のリンク及び前リンクを参照するように初期化し、更に前リンク内の順方向ポインタ及び次のリンク内の逆方向ポインタを、新たなリンクを参照するように変更する必要がある。リンクを削除するためには、ミューテータは、前リンク内の順方向ポインタを次のリンクを参照するように、また次のリンク内の逆方向ポインタを前リンクを参照するように変更する必要がある。
【０１２３】
複数の更新がアトミックに実行可能になるので、これらは最初に全ての影響されるリンク・ポインタを明確な順序でブロックすることにより、１つずつ実行される。リンク・ポインタをブロックしたミューテータは、それを変更する権利を確保済みである。リンク・ポインタがブロックされた事実により、他のミューテータはそれをブロックしたり、トラバースすることを阻止される。一旦ミューテータが、影響を受ける全てのリンク・ポインタをブロックすると、ミューテータはそれらを（再度明確な順序で）意図した新たな値により置換することにより、アンブロックすなわちブロック解除し、所望のリンクを挿入または削除する。
【０１２４】
イテレータとミューテータとの間の対話：
リンクを挿入または削除するためにミューテータは最初に、影響を受ける全てのリンク・ポインタをブロックする。非アトミック・インスペクタは、ブロックされたリンク・ポインタにより影響されない。これはブロックされたリンク・ポインタを通じて前進し、チェーン内の次のリンクをその新たな現リンクとして確立することができる。反復（非アトミック）ミューテータは、ブロックされたリンク・ポインタにより停止される。反復ミューテータが前進し、ブロックされたリンク・ポインタに遭遇すると、リンク・ポインタがブロック解除されるのを待機しなければならない。別のミューテータは、既にブロックされているリンク・ポインタをブロックする試行に失敗することになる。別のミューテータはリンク・ポインタがブロック解除されるのを待機してもよく、ブロック解除されるとき、このミューテータは再度リンク・ポインタをブロックすることを試行しなければならない。
【０１２５】
一旦ミューテータが、リンクを挿入または削除するために必要な全てのリンク・ポインタをブロックすると、ミューテータはブロックされたリンク・ポインタを越えて前進するために、それらのいずれかに依存する全ての（非アトミック）インスペクタ及び反復（非アトミック）ミューテータを待機しなければならない。ブロッキング・ミューテータは各こうしたイテレータにイテレータが影響されるリンク・ポインタを越えて前進したとき、そのことをミューテータに通知しなければならないことを伝え、次にこうした通知の発生を待機する。
【０１２６】
最後に一旦ミューテータが、ブロックされたリンク・ポインタに依存するイテレータが存在しないことを確認すると、ミューテータはそれらをブロック解除し、所望のリンクを挿入または削除する。一旦リンク・ポインタがブロック解除されると、それが最近ブロック解除されたことを知る必要無しにリンク・ポインタは他のイテレータによりトラバースされたり、別のミューテータによりブロックされたりする。一方、リンク・ポインタがブロック解除されるのを待機していた他のミューテータが存在した場合、アンブロッキング・ミューテータがそれらを呼び起こす。呼び起こされると、ブロックされた順方向リンク・ポインタを待機していた全ての反復ミューテータは、それらの前進をアトミックに完了し、それらの新たな現リンクとしてブロック解除された順方向ポインタが現在指し示すリンクを確立する。ブロックされた順方向リンク・ポインタを待機していた全てのブロッキング・ミューテータは、リンク・ポインタが解除されたことにより、再度リンク・ポインタをブロックするための再試行を行わねばならない。
【０１２７】
反復：
非アトミック・イテレータ（インスペクタまたはミューテータ）がアクティブ状態または遷移状態のとき、それに関連付けられるSharedChainNonatomicViewオブジェクトが存在する。イテレータにチェーンを通じて反復し、その現リンクを追跡する能力を与えるのは、このビュー・オブジェクトである。SharedChainオブジェクトは、これらのビュー・オブジェクトの２つのリストを保持する。一方のリストは非アトミック・インスペクタにより使用され、他は非アトミック・ミューテータにより使用される。非アトミック・イテレータが非アクティブ状態から移行するとき、使用可能なビュー・オブジェクトが適切なリスト内で見い出され、それに割当てられる。リスト内の全てのビュー・オブジェクトがビジーの場合、新たなビュー・オブジェクトが作成され、リストに追加される。イテレータが非アクティブ状態にリセットされるとき、ビュー・オブジェクトは、（同一タイプの）別の非アトミック・イテレータによる再利用のために使用可能である。
【０１２８】
SharedChainNonatomicViewオブジェクトは、イテレータの現リンクを識別する情報を含む。全てのビュー・オブジェクトは２つのリンクのどちらかに存在するので、ミューテータがリンクを挿入または削除するとき、ミューテータは全てのビュー・オブジェクトを見い出し、どのビュー・オブジェクトが自身が変更しているリンク・ポインタに依存するかを決定し、それらと適切に対話する。
【０１２９】
イテレータは数学的帰納法にやや似ているプロセスを通じて、チェーン内のリンクをトラバースする。すなわち、それは非アクティブ状態から最初のリンク（または任意のリンクの後のリンク）に移動する方法、及び任意のリンクから次のリンクに前進する方法を必要とする。イテレータのSharedChainNonatomicビュー・オブジェクトは、その現リンクを追跡するための次の２つのフィールドを有する。
【０１３０】
curLink７０６は、イテレータの現リンクのアドレスを含む。このフィールドがリンクを指し示す間、そのリンクをチェーンから削除することはできない。
【０１３１】
curPtr７０５は、リンク内の順方向ポインタのアドレスを含む。イテレータが現リンクを有する間、このフィールドの指し示す順方向ポインタは、イテレータがインスペクタかミューテータかに依存する。インスペクタに対して、このフィールドは現リンク内の順方向ポインタを指し示す。ミューテータに対して、このフィールドは前リンク内の順方向ポインタを指し示す（ブロックされていない場合には、現リンクを指し示す）。このことは前リンクがチェーンから削除されることを阻止し、別のリンクが前リンクと現リンクとの間に挿入されるのを阻止する。
【０１３２】
図１１は、反復非アトミック・ミューテータのビュー・オブジェクト７０１、及び非アトミック・インスペクタのビュー・オブジェクト７０２を示す。非アトミック・ミューテータは"リンクＢ"を現リンクと見なす。なぜなら、そのビュー・オブジェクト内では、curLinkが"リンクＢ"を指し示し、curPtrが"リンクＡ"内の順方向ポインタを指し示すからである。非アトミック・インスペクタは"リンクＣ"を現リンクと見なす。なぜなら、そのビュー・オブジェクト内では、curLinkが"リンクＣ"を指し示し、curPtrが"リンクＣ"内の順方向ポインタを指し示すからである。
【０１３３】
イテレータの開始−ポインタを最初のリンクにセット：
以下では、イテレータを開始するとき、curLink７０６及びcurPtr７０５を更新するプロセスについて述べる。この説明では、ブロッカとの対話については後に詳述するために、ほとんど考慮しない。
【０１３４】
ステップ１：イテレータをアクティブ状態に移行するためにgetFirstLink()機能が呼び出されるとき、ビュー・オブジェクトがイテレータに割当てられる。
ステップ２：curPtr７０５がSharedChainオブジェクト内のfirst_link_pointerフィールド６０２を指し示すようにセットされる。
ステップ３：以下で詳述するアルゴリズムに従い、curPtr７０５参照解除されて最初のリンクを指し示すポインタが獲得され、そのアドレスがcurLink７０６に保管される。これによりリスト内の最初のリンクがイテレータの現リンクとなる。図１１を参照すると、curPtrはsharedChainオブジェクト６０１内のfirst_link_pointerフィールド６０２を指し示し、curLinkは"リンクＡ"を指し示す。この時点で、"リンクＡ"はもはやチェーンから削除されることはできず、それより前にリンクを挿入することはできない。
ステップ４：イテレータがミューテータの場合、ここでプロセスは停止する。
イテレータがインスペクタの場合、curPtr７０５は現リンク内の順方向ポインタを指し示すようにセットされる。再度図１１を参照して、このことは"リンクＡ"がチェーンから削除されることを阻止するが、他のリンクがその前に挿入されることを許可する。
【０１３５】
イテレータの前進−ポインタを次のリンクにセット：
インスペクタ及びミューテータは、それらが前進するとき、同一のステップによりcurLink７０６及びcurPtr７０５をセットするが、順序は反対である。
【０１３６】
ステップ１：getNextLink()機能が呼び出されるとき、イテレータがインスペクタの場合、ステップ２にスキップする。ミューテータの場合は、前記ステップ４で述べたのと同一の処理が行われ、インスペクタがポインタを最初のリンクにセットする。すなわちcurPtr７０５が現リンク内の順方向リンク・ポインタを指し示すようにセットされる。図１１を参照すると、curPtr７０５は"リンクＡ"内の順方向ポインタを指し示し、curLink７０６は"リンクＡ"を指し示す。このことは依然、現リンク（"リンクＡ"）がチェーンから削除されることを阻止するが、前リンクはもはや保護されず、他のリンクが現リンクの直前に挿入されてもよい。
ステップ２：後述する同一のアルゴリズムに従い、curPtr７０５が参照解除されて、次のリンクを指し示すポインタが獲得され、アドレスがcurLink７０６に記憶される。そしてこれがイテレータの新たな現リンクとなる。図７を参照すると、curPtrは"リンクＡ"内の順方向ポインタを指し示し、curLinkは"リンクＢ"を指し示す。この時点で、"リンクＡ"も"リンクＢ"も、もはやチェーンから削除されることはできず、それらの間にリンクを挿入することはできない。
ステップ３：イテレータがミューテータの場合、ここでプロセスは停止する。
イテレータがインスペクタの場合、curPtr７０５は現リンク内の順方向ポインタを指し示すようにセットされる。再度図１１を参照して、このことは"リンクＢ"がチェーンから削除されることを阻止するが、"リンクＡ"の保護は提供せず、他のリンクがその前に挿入されることを許可する。
【０１３７】
チェーンの終わりへ前進：
結局、イテレータがチェーンの終わりに前進すると、現リンクに対してNULLが返却される。イテレータがインスペクタの場合、イテレータは非アクティブ状態にリセットされる。これによりそのビュー・オブジェクトがリセットされ、現リンクを有さなくなり、またイテレータから解離されて、別の非アトミック・インスペクタにより再利用可能になる。
【０１３８】
しかしながら、イテレータがミューテータの場合、イテレータは遷移状態となり、最後のリンク内の順方向ポインタを指し示すcurPtr７０５及びNULLを含むcurLink７０６と共に、ビュー・オブジェクトが保存されなければならない。この状態では、チェーン内の最後のリンクは除去することができず、別のリンクをその後に挿入することはできない。しかしながら、insertBeforeCurrentLnk()機能をこのミューテータ上で呼び出し、新たなリンクをチェーンの終わりに追加することは可能である。それ以外では、reset()機能がミューテータ上で呼び出されて、ミューテータを非アクティブ状態に移行し得る。ミューテータのリセットにより、そのビュー・オブジェクトがリセットされて現リンクを有さなくなり、またミューテータから解離されて、別の非アトミック・ミューテータにより再利用可能になる。
【０１３９】
ブロッキング・ミューテータと対話：
前進中のイテレータがブロッキング・ミューテータと対話する２つのポイントが存在する。イテレータがそのビュー・オブジェクト内のcurPtr７０５フィールドを変更するときは、次のリンクに前進したと見なされる時である。前進中のイテレータがブロッキング・ミューテータがそれを待機しているか否かに気づくのは、前進時にcurPtrを変更する間である。イテレータがそのビュー・オブジェクト内の新たなcurPtrを参照解除するとき、イテレータはリンク・ポインタがブロックされていることを発見するかもしれない。インスペクタはブロックされたリンク・ポインタを通じて前進することができるが、ミューテータはリンク・ポインタがブロック解除されるのを待機しなければならない。
【０１４０】
リンク・ポインタのブロッキング：
図１２は、SharedChainオブジェクト、ブロッカ・オブジェクト及びリンクの間の関係を示す。（アトミックまたは非アトミック）ミューテータがリンクを挿入または削除しているとき、これは関連付けられるSharedChainBlockerオブジェクト８０１を有する。ミューテータに、リンク・ポインタをブロック及びブロック解除する能力、及び他のミューテータまたはイテレータと対話する能力を与えるのは、ブロッカ・オブジェクトである（必要に応じて待機し、互いに起こし合う）。SharedChainオブジェクト６０１はブロッカ・オブジェクトのリストを保持し、リスト上の最初のブロッカ・オブジェクトを指し示すポインタ８０３を含む。ミューテータがミューテート機能を開始するとき、使用可能なブロッカ・オブジェクトがリスト内で見い出され、それに割当てられる。リスト内の全てのブロッカ・オブジェクトがビジーの場合、新たな１つが作成されリストに追加される。ミューテート機能が完了し、もはやブロッカ・オブジェクトの未解決の参照が存在しない場合、SharedChainオブジェクトは別のミューテート機能により再利用可能になる。
【０１４１】
ミューテータはリンク・ポインタをブロックして、そのリンク・ポインタの排他的使用を獲得する。ミューテータは、リンク・ポインタが隣接リンクではなく、ミューテータのブロッカ・オブジェクトを指し示すように変更することにより、リンク・ポインタをブロックする。その一方で、リンク・ポインタのオリジナル内容をアトミックに抽出する。順方向リンク・ポインタをブロックするとき、そのオリジナル内容もアトミックにブロッカ・オブジェクト自身内（next_link_field８０２）に記憶され、こうして非アトミック・インスペクタがブロックされたリンク・ポインタを通じてトラバースできるようになる。
【０１４２】
リンク・ポインタの変更は、それを参照する他の全てのイテレータに影響を及ぼし、好適には、単にそれを見るだけでリンク・ポインタが隣接リンクを指し示すか、ブロッカ・オブジェクトを指し示すかを判断する方法が存在する。好適な実施例の環境では、リンク・オブジェクト及びブロッカ・オブジェクトの両方が、少なくともＭバイト境界上に存在しなければならず、従って、それらのアドレスの下位Ｎビットは、常に０であることが知れている。好適な実施例では、Ｍは１６で、Ｎは４である。従って、順方向リンク・ポインタ及び逆方向リンク・ポインタ内のこれらのビットはフラグとして使用される。以下でより詳しく述べるが、ここではこれらのビットがオフであるとき、リンク・ポインタが隣接リンクを指し示すこと、及びミューテータがリンク・ポインタ内にそのブロッカ・オブジェクトのアドレスを記憶するとき、常に下位（ｘ０１）ビットをオンにすることだけを述べておく。このビットは、リンク・ポインタがブロックされており、（下位４ビットのマスキングをオフすることにより）ブロッカ・オブジェクトを指し示す。
【０１４３】
図１２は、"リンクＡ"内の順方向リンク・ポインタ８０５をブロックしたブロッカ・オブジェクト８０１を示す。ブロックされたリンク・ポインタに遭遇する他の反復ミューテータ及びブロッキング・ミューテータは、これがブロック解除されるのを待機しなければならない。ブロックされたリンク・ポインタに遭遇するインスペクタは、ポインタをブロッカ・オブジェクトの中から（next_linkフィールド８０２を介して）"リンクＢ"にセットし、リンク・ポインタがブロック解除されるのを待機する必要がない。
【０１４４】
アトミック・ミューテータ：
このセクションでは、アトミック・ミューテータの様々なミューテート機能に関わる処理について述べる。チェーンのミューテータのアトミック・ビューのために、これはリンク内の順方向ポインタ及び逆方向ポインタを自由に追跡でき、プロセスを単純化する支援をする。しかしながら、これは後に非アトミック・ミューテータについて考慮する際に有用な良い方向性を提供する。様々なリンク・ポインタを把握するために、必要に応じて前の図面を参照することにする。
【０１４５】
リンクの挿入、アトミック・メソッド：
新たなリンクをチェーン内に挿入することのできる様々な機能（メソッド）が存在する。これらの全てが前リンクを突き止め、リンクの挿入、共通アトミック・プロシージャで述べるステップを実行する単純なフロントエンドと見なされる。
【０１４６】
insertAfterArbitraryLink()：
このメソッドは新たなリンクを（チェーン内に存在すると思われる）指定された任意のリンクの直後に挿入する。リンクを挿入するステップ、すなわち共通アトミック・プロシージャが実行され、任意のリンクの参照を受け渡し、これが前リンクとなる。
【０１４７】
insertAfterCurrentLink()：
このメソッドは新たなリンクをミューテータの現リンクの直後に挿入する。ミューテータが現リンクを有さない場合、メソッドは失敗する。それ以外では、リンクを挿入するステップ、すなわち共通アトミック・プロシージャが実行され、現リンクの参照を前リンクとして受け渡す。
【０１４８】
insertFirst()：
このメソッドは新たなリンクをチェーン内の最初のリンクとして挿入する。リンクを挿入するステップ、すなわち共通アトミック・プロシージャが実行され、前リンクの参照としてNULLを受け渡す。
【０１４９】
insertBeforeArbitraryLink()：
このメソッドは新たなリンクを（チェーン内に存在すると思われる）指定された任意のリンクの直前に挿入する。これは任意のリンク内の逆方向ポインタを追跡して前リンクを突き止める。リンクを挿入するステップ、すなわち共通アトミック・プロシージャが実行され、前リンクの参照を受け渡す。
【０１５０】
insertBeforeLink()：
このメソッドは新たなリンクをミューテータの現リンクの直前に挿入する。ミューテータが現リンクを有さない場合、メソッドは失敗する。それ以外では、前リンクを突き止めるために現リンク内の逆方向ポインタが追跡され、リンクを挿入するステップ、すなわち共通アトミック・プロシージャが実行され、前リンクの参照を受け渡す。
【０１５１】
insertLast()：
このメソッドは新たなリンクをチェーン内の最後のリンクとして挿入する。これはlast_pointerフィールド６０３から、現在の最後のリンクを指し示すポインタを獲得しする。リンクを挿入するステップ、すなわち共通アトミック・プロシージャが実行され、最後のリンクの参照を前リンクとして受け渡す。
【０１５２】
リンクの挿入、共通アトミック・プロシージャ：
このプロシージャは、前リンクの直後への新たなリンクの挿入を達成する。前リンクの参照が入力パラメータとして受け渡される。
ステップ１：チェーン内のリンクのカウントが増分される。
ステップ２：前リンク内の順方向ポインタが突き止められる。しかしながら、前リンクがNULLの場合、これは新たなリンクがチェーン内の最初のリンクとして挿入されることを意味する。その場合、SharedChainオブジェクト内のfirst_link_pointerフィールド６０２を突き止める。
ステップ３：ステップ２において突き止められるポインタが、次のリンクにセットされる。
ステップ４：次のリンク内の逆方向ポインタが突き止められる。しかしながら、次のリンクがNULLの場合、これは新たなリンクがチェーン内の最後のリンクとして挿入されることを意味する。その場合、SharedChainオブジェクト内のlast_link_pointerフィールド６０３を突き止める。
ステップ５：新たなリンクの順方向ポインタが、次のリンクを指し示すように初期化され、その逆方向ポインタが前リンクを指し示すように初期化される。リンクがチェーン・オブジェクトを指し示すフィールドを定義している場合、そのフィールドも同様に初期化される。
ステップ６）（ステップ２で突き止められた）前リンク内の順方向ポインタがブロックされる。また、ブロッカ・オブジェクト内のnext_linkフィールド８０２内の次のリンクを指し示すポインタをアトミックに記憶する（このことは非アトミック・インスペクタがブロックされたリンク・ポインタを通じて、次のリンクに前進することを許可する）。
ステップ７）ブロッカ・オブジェクト内のnext_linkフィールドが、次のリンクを指し示すように変更される。これは今後、ブロックされたリンク・ポインタを通じて前進する非アトミック・インスペクタが、新たに挿入されるリンクに遭遇することを意味する。
ステップ８：メソッドがブロックされたリンク・ポインタを通じて、次のリンク（新たなリンクではない）へ前進中の非アトミック・インスペクタが、その前進を完了するのを待機する。
ステップ９：（ステップ４で突き止められた）次のリンク内の逆方向ポインタが、新たなリンクを指し示すように変更される。
ステップ１０：（ステップ６でブロックされた）前リンク内の順方向ポインタが、新たなリンクを指し示すように変更される。
【０１５３】
リンクの削除、アトミック・メソッド：
チェーンからリンクを削除できる様々な機能（メソッド）が存在する。これらの全てが前リンクを突き止め、後述の"リンクの削除、共通アトミック・プロシージャ"で述べるステップを実行する単純なフロントエンドと見なされる。
【０１５４】
removeArbitraryLink()：
このメソッドは、（チェーン内に存在すると思われる）指定された任意のリンクを削除する。これは任意のリンク内の逆方向ポインタを追跡して、前リンクを突き止める。リンクを削除するステップ、すなわち共通アトミック・プロシージャが実行され、前リンクの参照を受け渡す。
【０１５５】
removeLastLink()：
このメソッドはチェーンから最後のリンクを削除する。SharedChainオブジェクト内のlast_link_pointerフィールド６０３がNULLの場合、削除するリンクは存在しない。それ以外では、last_link_pointerフィールド６０３を追跡して、チェーン内の最後のリンクを突き止め、そのリンク内の逆方向ポインタを追跡して、前リンクを突き止める。次に、リンクを削除するステップ、すなわち共通アトミック・プロシージャを実行し、前リンクの参照を受け渡す。
【０１５６】
removeFirstLink()：
このメソッドはチェーンから最初のリンクを削除する。次に、リンクを削除するステップ、すなわち共通アトミック・プロシージャを実行し、前リンクの参照としてNULLを受け渡す。
【０１５７】
removeBeforeArbitraryLink()：
このメソッドは（チェーン内に存在すると思われる）指定された任意のリンクの直前のリンクを削除する。任意のリンク内の逆方向ポインタがNULLの場合、削除するリンクは存在しない。それ以外では、任意のリンク内の逆方向ポインタを追跡して、削除されるリンクを突き止め、またそのリンク内の逆方向ポインタを追跡して、前リンクを突き止める。次に、リンクを削除するステップ、すなわち共通アトミック・プロシージャを実行し、前リンクの参照を受け渡す。
【０１５８】
removeAfterArbitraryLink()：
このメソッドは（チェーン内に存在すると思われる）指定された任意のリンクの直後のリンクを削除する。次に、リンクを削除するステップ、すなわち共通アトミック・プロシージャを実行し、任意のリンクの参照を前リンクとして受け渡す。
【０１５９】
removeCurrentLink()：
このメソッドは、ミューテータの現リンクを削除する。ミューテータが現リンクを有さない場合、削除するリンクが存在しない。それ以外では、現リンク内の逆方向ポインタを追跡し、前リンクを突き止める。次に、リンクを削除するステップ、すなわち共通アトミック・プロシージャを実行し、前リンクの参照を受け渡す。
【０１６０】
removeAfterCurrentLink()：
このメソッドはミューテータの現リンクに続くリンクを削除する。次に、リンクを削除するステップ、すなわち共通アトミック・プロシージャを実行し、現リンクの参照を前リンクとして受け渡す。
【０１６１】
リンクの削除、共通アトミック・プロシージャ：
後述のステップは、リンクの削除を達成するために行われる。前リンクの参照が入力パラメータとして受け渡される。削除されるリンクは、前リンクの直後のリンクである。
ステップ１：前リンク内の順方向ポインタが突き止められる。しかしながら、前リンクがNULLの場合、削除されるリンクはチェーン内の最初のリンクである。その場合、SharedChainオブジェクト内のfirst_link_pointerフィールド６０２を突き止める。
ステップ２：ステップ１で突き止められたリンク・ポインタがNULLの場合、削除されるリンクは存在しない。それ以外では、メソッドはそのリンク・ポインタをブロックし、次のステップに継続する。（リンク・ポインタをアトミックにブロックすることにより削除されるリンクを指し示すポインタが、ブロッカ・オブジェクト内のnext_linkフィールド８０２に記憶される。このことは、前リンク内でブロックされた順方向リンク・ポインタに遭遇する非アトミック・インスペクタが、そのリンク・ポインタをステップ・スルーし、まだ除去されていないリンクを見い出すことを可能にする。）
ステップ３：ステップ２でブロックされたリンク・ポインタの旧値を用いて、削除されるリンクが突き止められる。
ステップ４：メソッドが、削除されているリンク内の順方向ポインタをブロックする。メソッドはまた、ブロッカ・オブジェクト内のnext_linkフィールド８０２内の次のリンクを指し示すポインタを記憶する。この時点以降、非アトミック・インスペクタは、前リンクまたは削除されているリンク内でブロックされた順方向ポインタに遭遇しても、もはや削除されているリンクに遭遇することはなく、それを飛び越えて代わりに次のリンクに遭遇する。
ステップ５：メソッドは、削除されるリンク向けて依然前進中の、或いはその現リンクが削除されているリンクに該当する（非アトミック）インスペクタが、それを越えて前進するのを待機する。
ステップ６：ステップ４でブロックされたリンク・ポインタの旧値から、次のリンクが突き止められる。
ステップ７：メソッドは次のリンク内の逆方向ポインタを突き止める。しかしながら、次のリンクがNULLの場合、削除されるリンクはチェーン内の最後のリンクである。その場合、SharedChainオブジェクト内のLast_link_pointerフィールド６０３を突き止める。
ステップ８：ステップ７で突き止められた逆方向ポインタが、前リンクを指し示すように変更される。
ステップ９：ステップ２でブロックされた前リンク内の順方向ポインタが、次のリンクを指し示すように変更される。
ステップ１０：チェーン内のリンクのカウントが減分される。
ステップ１１：削除されたリンク内の順方向リンク・ポインタ・フィールド及び逆方向リンク・ポインタ・フィールド（及び定義されている場合、任意のチェーン・ポインタ・フィールド）が、NULLにセットされる。
【０１６２】
アトミック・ミューテータの現リンクの考察：
ミューテータはミューテート機能を実行開始するとき、現リンクを有したり、有さなかったりする。アトミック・ミューテータが現リンクを有する場合、その現リンクを自身が実行する挿入機能または削除機能を通じて保存してもよい。但し、これは現リンクに当たるリンクをたまたま削除している場合を除く。その場合には、ミューテータがリセットされるか、新たな現リンクが選択されなければならない。更に、ミューテート機能を実行するとき、現リンクをミューテータに割当てたり、ミューテータの現リンクを変更することも合理的である。いずれの場合も、ミューテータはアトミック・ビューを有するので、これらの考察はそれ程重要でない。しかしながら、これらの考察は、非アトミック・ミューテータではより重要となり、それらとの互換性のために、アトミック・ミューテータ機能は入力MutatorControlパラメータを取り、MutatorResultを戻し（または更新する）、現リンクに関連する全てのオプションをサポートする。
【０１６３】
非アトミック・ミューテータ：
このセクションは、非アトミック・ミューテータの様々なミューテータ機能に関連する処理について述べる。ミューテータの非アトミック・ビューは、リンク・ポインタを追跡及びブロックすることをより複雑にする。なぜなら、他の非アトミック・ミューテータもそれらをブロックしようとしているかもしれないからである。デッドロックを回避するため、特殊な注意が払わねばならない。リンク・ポインタは明確なシーケンスでブロック、及びブロック解除されなければならない。一部のケースでは、一時的に別のミューテータに従うために、暫定的にブロックされたリンク・ポインタを延期することが必要である。２つの例外（insertAfterCurrentLink()及びremoveAfterCurrentLink()）により、ミューテータはミューテート機能を実行している間、現リンクを維持することができない。しかしながら、ミューテート機能が完了するとき、新たな現リンク（チェーン内でのミューテータの場所を保存する）がミューテータに割当てられる。
【０１６４】
リンクの挿入、非アトミック・メソッド：
リンクをチェーン内に挿入するため、最初にブロックされなければならない２つのリンク・ポインタが存在する。それらは、前リンク内の順方向ポインタと、次のリンク内の逆方向ポインタである。前リンク内の順方向ポインタのブロックは主要ブロックである。一旦このリンク・ポインタがブロックされると、それは新たなリンクが挿入される場所を決定する。
【０１６５】
図１３は、"リンクＢ"を"リンクＡ"と"リンクＣ"の間のチェーン内に挿入するために必要なリンク・ポインタをブロックした、ミューテータのブロッカ・オブジェクトを示す。ブロックされたリンク・ポインタ（すなわち"リンクＡ"内の順方向リンク・ポインタ９０１、及び"リンクＣ"内の逆方向リンク・ポインタ９０２）の両方がブロッカ・オブジェクトを指し示し、ｘ０１ビットがオンにセットされる。ブロッカ・オブジェクト内のnext_linkフィールド８０２は、"リンクＢ"を指し示し、従って"リンクＡ"内のブロックされた順方向ポインタに遭遇する非アトミック・インスペクタは、"リンクＢ"を次のリンクと見なす。
【０１６６】
リンクをチェーンに挿入する様々な方法が存在する。これらの全てがフロント・エンドと見なされて開始され、他のメソッドに継続する。
【０１６７】
insertFirst()：
このメソッドは、SharedChainオブジェクト内のfirst_link_pointerフィールド６０２を突き止める。これは最初にブロックされなければならないリンク・ポインタであり、最終的には、新たに挿入されたリンクを指し示し、これがチェーン内の最初のリンクとなる。リンクを挿入するステップ、すなわち共通非アトミック・プロシージャが実行され、SharedChainオブジェクト内のfirst_link_pointerフィールド６０２の参照を受け渡す。
【０１６８】
insertAfterArbitraryLink()：
指定された任意のリンクが前リンクとなる。このメソッドはそのリンク内の順方向ポインタを突き止める。これは最初にブロックされなければならないリンク・ポインタであり、最終的には、新たに挿入されたリンクを指し示し、これが指定された任意のリンクの直後に来る。リンクを挿入するステップ、すなわち共通非アトミック・プロシージャが実行され、指定された任意のリンク内の順方向ポインタの参照を受け渡す。
【０１６９】
insertAfterCurrentLink()：
ミューテータの現リンクがNULLの場合、この機能は失敗するはずである。それ以外では、次のステップが実行され、新たなリンクを現リンクの直後に挿入しようとする。この機能は失敗してミューテータを新たな現リンクに預ける可能性があるが、"チェーン内のその場所"は維持される。
【０１７０】
ａ）ミューテータのビュー・オブジェクト７０２内のcurLinkフィールド７０６が現リンクを指し示す。ミューテータは、現リンク内の順方向リンク・ポインタをブロックしようとする。リンク・ポインタがそのリンクを削除しようとするミューテータによりブロックされない限り、ミューテータはブロック試行を必要に応じて待機し、再試行する。ブロック試行が成功裡に行われると、ステップｂ）に継続する。それ以外では、ブロック試行は失敗する。なぜなら、別のミューテータが既にリンク・ポインタをブロックしており、それを含むリンク（このミューテータの現リンク）を削除することをコミットしているからである。他の（ブロッキング）ミューテータはまた、前リンク（このミューテータのcurPtr７０５が指し示すリンク）内の順方向ポインタをブロックしたであろう。ブロッキング・ミューテータは、このミューテータがリンク・ポインタをブロックしようとして失敗したことを何も知らないが、結局、それを単にブロックされたリンク・ポインタに接続される反復ミューテータと見なすかもしれず、そうであれば、それが前進するのを待機する。デッドロックを回避するために、このミューテータのビュー・オブジェクトは、ブロッキング・ミューテータの道筋から逸らされる。これを行うために、このミューテータのビュー・オブジェクトは、順方向に前進するのではなく、代わりに（curPtrが指し示す）前リンク内のブロックされた順方向ポインタに向けて、丁度前進しているように見られるように変更される。必要に応じて、このミューテータが前進したことがブロッキング・ミューテータに伝えられ、ミューテータはブロッキング・ミューテータがそのリンク・ポインタをブロック解除するのを待機する。ブロッキング・ミューテータがリンク・ポインタをブロック解除するとき、ブロッキング・ミューテータはこの待機中のミューテータのビュー・オブジェクトを調査し、そのcurLink７０６を新たな現リンクを指し示すようにセットし（前進を完了する）、（ブロックされたリンク・ポインタを待機していた反復ミューテータに対するように）このミューテータを呼び起こす。呼び起こされた時、このミューテータはチェーン内のその同一の位置を保存するが（すなわち、そのビュー・オブジェクト内のcurPtr７０５が変更されない）、新たな現リンクを有するので挿入機能を再試行することは意味がない。代わりに、それは存在して失敗指示をクライアントに戻し、クライアントはgetCurrentLink()機能を呼び出し、新たな現リンクを調査し、何を行うかを決定する。
【０１７１】
ｂ）ミューテータがその現リンクを保存しない場合、ミューテータのビュー・オブジェクトがリセットされる。ミューテータが新たな現リンクを有する場合、それが後に再度確立される。
【０１７２】
ｃ）メソッドは次のリンク内の逆方向ポインタをブロックし、それが成功裡にブロックされるまで必要に応じて待機及び再試行する。（次のリンクがNULLの場合、代わりにSharedChainオブジェクト内のLast_link_pointerフィールド６０３をブロックする。）しかしながら、ブロックすべきリンク・ポインタが別のミューテータにより暫定的にブロックされる場合、メソッドはリンク・ポインタをブロックしようとしない。代わりにリンク転送機構（後述）を用いて、他のミューテータからのリンク・ポインタの使用許可を待機する。（他のミューテータはリンク転送機構を用いて、リンク・ポインタのブロックを延期し、リンク・ポインタの使用の許可を与え、再開の許可を待機する。）
【０１７３】
ｄ）リンクを挿入するステップ、すなわち共通非アトミック・プロシージャが、ステップ１１から実行される。
【０１７４】
insertLast()：
このメソッドは、SharedChain()オブジェクト内のlast_link_pointer６０３を突き止める。これは最終的には、新たに挿入されたリンクを逆方向に指し示すリンク・ポインタであり、これがチェーン内の最初のリンクとなる。リンクを挿入するステップ、すなわち共通非アトミック・プロシージャが、ステップ６から開始して実行され、SharedChainオブジェクト内のlast_link_pointerフィールド６０３の参照を受け渡す。
【０１７５】
insertBeforeArbitraryLink()：
指定された任意のリンクが次のリンクとなる。このメソッドはそのリンク内の逆方向ポインタを突き止める。このリンク・ポインタは最終的に、新たに挿入されたリンクを逆方向に指し示し、これが指定された任意のリンクの直前に来る。リンクを挿入するステップ、すなわち共通非アトミック・プロシージャがステップ６から開始して実行され、指定された任意のリンク内の逆方向ポインタの参照を受け渡す。
【０１７６】
insertBeforeCurrentLink()：
ミューテータが非アクティブ状態の場合、新たなリンクを挿入する余地はなく機能は失敗する。それ以外では、現リンクの直前に新たなリンクを挿入する試行のために、次のステップが使用される。この機能も失敗してミューテータを新たな現リンクに預ける可能性があるが、チェーン内のその場所は維持される。
【０１７７】
ａ）ミューテータのビュー・オブジェクト７０２内のcurPtrkフィールド７０５が、前リンク内の順方向リンク・ポインタを指し示す。ミューテータはこのリンク・ポインタをブロックしようとするが、その成功のための再試行または待機は行わない。ブロック試行が成功裡に行われると、ステップｂ）に継続する。それ以外では、ブロック試行は失敗する。なぜなら、別のミューテータが既にリンク・ポインタをブロックしているからである。他の（ブロッキング）ミューテータは、このミューテータがリンク・ポインタをブロックしようとして失敗したことを何も知らないが、結局、それを単にブロックされたリンク・ポインタに接続される反復ミューテータと見なすかもしれず、そうであれば、それが前進するのを待機する。デッドロックを回避するために、このミューテータのビュー・オブジェクトは、ブロッキング・ミューテータの道筋から逸らされる。これを行うために、このミューテータのビュー・オブジェクトは、順方向に前進するのではなく、代わりにブロックされた順方向ポインタに向けて丁度前進しているように見られるように変更される。必要に応じてブロッキング・ミューテータは、このミューテータが前進したことを伝えられる。次に、このミューテータは、ブロッキング・ミューテータがそのリンク・ポインタをブロック解除するのを待機する。ブロックされたリンク・ポインタが、そのポインタを含むリンクを削除しようとしたミューテータによりブロックされた場合、ミューテータは前リンク内の順方向ポインタもブロックしているであろう。この場合、このミューテータのビュー・オブジェクトは、その前ポインタに向けて丁度前進しているように見られるように移動され、必要に応じて、ブロッキング・ミューテータに前進が伝えられる。このミューテータは次に、ブロッキング・ミューテータがそのリンク・ポインタをブロック解除するのを待機する。その時、ブロッキング・ミューテータはこの待機中のミューテータのビュー・オブジェクトを調査し、そのcurLink７０６を、削除されたリンクの次のリンクを指し示すようにセットし（前進を完了する）、ブロックされたリンク・ポインタを待機していた反復ミューテータに対するように、このミューテータを呼び起こす。呼び起こされた時、このミューテータは新たなcurPtr７０５を有するが同一のcurLink７０６を有する。次に、ステップａ）の先頭に戻ることにより挿入が再試行される。しかしながら、ブロックされたリンク・ポインタが、そのポインタを含むリンクを削除しようとしないミューテータによりブロックされた場合には、このミューテータのビュー・オブジェクトは、ブロックされたリンク・ポインタに向けて丁度前進しているように見られるように移動され、必要に応じてブロッキング・ミューテータに前進が伝えられる。次に、このミューテータは、ブロッキング・ミューテータがそのリンク・ポインタをブロック解除するのを待機する。その時、ブロッキング・ミューテータはこの待機中のミューテータのビュー・オブジェクトを調査し、そのcurLink７０６を、削除されたリンクの次のリンクを指し示すようにセットし（前進を完了する）、ブロックされたリンク・ポインタを待機していた反復ミューテータに対するよう��、このミューテータを呼び起こす。呼び起こされた時、このミューテータはチェーン内の同一の位置を保持するが（すなわち、そのビュー・オブジェクト内のcurPtr７０５が変更されない）、新たな現リンクを有するので挿入機能を再試行することは意味がない。代わりに、それは存在して失敗指示をクライアントに戻し、クライアントはgetCurrentLink()機能を呼び出し、新たな現リンクを調査し、何を行うかを決定する。
【０１７８】
ｂ）この時点で、前リンク内の順方向ポインタは成功裡にブロックされている。ミューテータがその現リンクを保存する場合、そのビュー・オブジェクト内のcurPtrフィールドが、挿入されているリンク内の順方向ポインタを指し示すように変更される。（これは、他のイテレータがこの新たなリンクをまだ見ることができないために安全である。）それ以外では、ミューテータのビュー・オブジェクトはリセットされ、従って、もはや現リンクを有さない。これは潜在的なデッドロックを回避するために必要であり、現リンクはどのリンクを前に挿入するかを識別するためにもはや必要とされない。必要に応じて、ミューテータの現リンクが後に再確立されてもよい。
【０１７９】
ｃ）ミューテータは（前の）現リンク内の逆方向ポインタをブロックし、それが成功裡にブロックされるまで、必要に応じて待機及び再試行する。（（前の）現リンクがNULLの場合、代わりにSharedChainオブジェクト内のLast_link_pointerフィールド６０３をブロックする。）しかしながら、ブロックすべきリンク・ポインタが別のミューテータにより暫定的にブロックされる場合、ミューテータはリンク・ポインタをブロックしようとしない。代わりに、リンク転送機構（後述）を用いて、他のミューテータからのリンク・ポインタの使用許可を待機する。（他のミューテータはリンク転送機構を用いてリンク・ポインタのブロックを延期し、リンク・ポインタの使用の許可を与え、再開の許可を待機する。）
【０１８０】
ｄ）リンクを挿入するステップ、すなわち共通非アトミック・プロシージャが実行される。
【０１８１】
リンクの挿入、共通非アトミック・プロシージャ
これは前述の機能の続きである。複数の開始点が存在する。すなわち、insertFirst()メソッド及びinsertAfterArbitraryLink()メソッドは、入力パラメータとして渡される前リンク内の順方向ポインタを参照して、ステップ１で開始し、insertLast()メソッド及びinsertBeforeArbitraryLink()メソッドは、入力パラメータとして渡される次のリンク内の逆方向ポインタを参照して、ステップ６で開始する。insertBeforeCurrentLink()メソッド及びinsertAfterCurrentLink()メソッドは、ステップ１１で開始する。
【０１８２】
ステップ１：ミューテータがリセットされ、現リンクを有さないことを保証する。これはデッドロックを回避するために必要である。ミューテータの現リンクは、必要に応じて後に再確立される。
【０１８３】
ステップ２：ミューテータが前リンク内の順方向ポインタをブロックし、それが成功裡にブロックされるまで、必要に応じて待機及び再試行する。このポインタのブロッキングは、リスト内の次のリンクを指し示すポインタを戻し、そのリンクを指し示すポインタを、ブロッカ・オブジェクト内のnext_linkフィールド８０２にアトミックに記憶する。新たなリンクが、前リンクと次のリンクの間に挿入される。
【０１８４】
ステップ３：次のリンク内の逆方向ポインタが突き止められる。しかしながら、次のリンクがNULLの場合には、SharedChainオブジェクト内のlast_link_pointerフィールド６０３を突き止める。
【０１８５】
ステップ４：ミューテータは、ステップ３で突き止められたリンク・ポインタをブロックし、それが成功裡にブロックされるまで、必要に応じて待機及び再試行する。しかしながら、リンク・ポインタが別の（ブロッキング）ミューテータにより暫定的にブロックされる場合、ミューテータはリンク・ポインタをブロックしようとしない。代わりにリンク転送機構（後述）を用いて、他のミューテータからのリンク・ポインタの使用許可を待機する。（ブロッキング・ミューテータはリンク転送機構を用いて、リンク・ポインタのブロックを延期し、このミューテータにリンク・ポインタの使用の許可を与え、再開の許可を待機する。）
【０１８６】
ステップ５：ステップ１１に継続する。
【０１８７】
ステップ６：ミューテータがリセットされ、現リンクを有さないことを保証する。これはデッドロックを回避するために必要である。ミューテータの現リンクは、必要に応じて後に再確立される。
【０１８８】
ステップ７：ミューテータが次のリンク内の逆方向ポインタをブロックし、それが成功裡にブロックされるまで、必要に応じて待機及び再試行する。このリンク・ポインタのブロッキングは、前リンクを指し示すポインタを戻す。このブロックは暫定的であり、ステップ４でまだ試行されていないブロックが、成功裡に行われない場合、延期されされる必要がある。ブロックされたリンク・ポインタ内のフラグ（図示せず）は、それが暫定的にブロックされていることを示す。
【０１８９】
ステップ８：前リンク内の順方向ポインタ・フィールドが突き止められる。しかしながら、前リンクがNULLの場合、SharedChainオブジェクト内のfirst_link_pointerフィールド６０２が代わりに突き止められる。
【０１９０】
ステップ９：ミューテータは、ステップ８で突き止められたリンク・ポインタをブロックしようとするが、それが成功するのを再試行または待機しない。ブロック試行が成功の場合には、ステップ１０に継続する。それ以外では、リンク・ポインタが既に別の（ブロッキング）ミューテータによりブロックされたためにブロック試行が失敗する。ブロッキング・ミューテータは前リンクを削除しているか、その後に新たなリンクを挿入している。どちらの場合にも、ブロッキング・ミューテータは結局、ステップ７で暫定的にブロックされたリンク・ポインタをブロックする必要がある。リンク・ポインタが暫定的にブロックされていると判断するとき、ブロッキング・ミューテータはリンク転送機構を用いてリンク・ポインタの使用の許可を待機する。このミューテータはリンク転送機構を用いてリンク・ポインタを延期し、ブロッキング・ミューテータに使用許可を与える一方、ステップ７で行われたブロックを保存する。ブロックされたリンク・ポインタの使用許可を与えるに際してブロッキング・ミューテータに前リンクを指し示すポインタを与える。このミューテータは次にリンク転送機構を用いて、ブロッキング・ミューテータが終えるのを待機し、その時点で、再開の許可を与え、新たな前リンクを指し示すポインタを受け渡す。新たな前リンクを指し示すポインタにより、このミューテータはステップ８に戻り、その中の順方向リンク・ポインタを再度ブロックするように試行する。
【０１９１】
ステップ１０：この時点で、前リンクの順方向ポインタ内のブロックが成功裡に行われ、次のリンクを指し示すポインタが、ブロッカ・オブジェクト内のnext_linkフィールド８０２内にアトミックにセットされる。もはやステップ７で行われたブロックが暫定的である理由は存在せず、ブロックされたリンク・ポインタ内のフラグがオフされ、もはや暫定的でないことを示す。
【０１９２】
ステップ１１：チェーン内のリンクのカウントが増分される。
【０１９３】
ステップ１２：新たなリンク内の順方向ポインタ及び逆方向ポインタが、それぞれ次のリンク、及び前リンクを指し示すようにセットされる。定義済みの場合、任意のチェーン・ポインタ・フィールドがSharedChainオブジェクトを指し示すようにセットされる。
【０１９４】
ステップ１３：ブロッカのnext_linkフィールド８０２が、新たなリンクを指し示すようにセットされる。以後、前リンク内のブロックされた順方向リンク・ポインタに遭遇するインスペクタは、新たなリンクを見い出すことになる。
【０１９５】
ステップ１４：ミューテータは、ブロックされた順方向リンク・ポインタに依存する前進中の非アトミック・イテレータ（インスペクタまたはミューテータ）が、それを越えて前進するのを待機する。これらは順方向リンク・ポインタがブロックされる前にそれらに到達したイテレータであるか、ブロックされたリンク・ポインタを通じて、次のリンク（新たなリンクではない）に前進中のインスペクタである。
【０１９６】
ステップ１５：リンクを挿入または削除するステップ、すなわち共通非アトミック・プロシージャが実行され、挿入プロセスを終了する。
【０１９７】
リンクの削除、非アトミック・メソッド：
図１４を参照すると、チェーンからリンクを削除するために、最初にブロックされなければならない４つのリンク・ポインタが存在する。それらは、ａ）前リンク内の順方向ポインタ１００２、ｂ）削除されるリンク内の逆方向ポインタ１００３、ｃ）削除されるリンク内の順方向ポインタ１００４、及びｄ）次のリンク内の逆方向ポインタ１００５である。前リンク内の順方向ポインタ上のブロックは、主要ブロックである。一旦このブロックが行われると、削除されるリンクが決定される。
【０１９８】
図１４は、チェーンから"リンクＢ"を削除するために必要なリンク・ポインタをブロックしたミューテータのブロッカ・オブジェクトを示す。ブロックされたリンク・ポインタは全てブロッカ・オブジェクトを指し示し、ｘ０１ビットがオンされる。（更に、削除されるリンク内の順方向ポインタ１００４は、ｘ０８ビットもオンされ、それが削除されているリンク内に存在することを示す。）ブロッカ・オブジェクト内のnext_linkフィールド８０２は"リンクＣ"を指し示し、従って、"リンクＡ"または"リンクＢ"内のブロック済みの順方向ポインタに遭遇する非アトミック・インスペクタは、"リンクＢ"をスキップし、"リンクＣ"を次のリンクと見なす。ブロッカ・オブジェクト内のprevious_link_pointerフィールド１００１は、"リンクＡ"内の順方向ポインタを指し示す。これは一部のケースにおいて、"リンクＢ"内のブロック済みの順方向ポインタに遭遇し、"リンクＢ"が削除された後に"リンクＣ"を新たな現リンクと見なすために、curPtrを"リンクＡ"内の順方向ポインタに戻す必要のある反復ミューテータにより使用される。
【０１９９】
チェーンからリンクを削除できる様々な機能が存在する。これらの全てが、前リンク内の順方向ポインタをブロックするフロントエンドと見なされ、これは次に、後述の"リンクの削除、共通アトミック・プロシージャ"で述べるステップを実行することにより残りのリンク・ポインタをブロックし、リンクを削除する。
【０２００】
removeFirstLink()：
ミューテータのビュー・オブジェクトが最初にリセットされ、現リンクを有さないことを保証する。これは潜在的なデッドロックを回避するために必要である。ミューテータの現リンクは、後に必要に応じて再確立される。ミューテータは次に、SharedChainオブジェクト内のfirst_link_pointerフィールド６０２をブロックし、それが成功裡にブロックされるまで必要に応じて待機及び再試行する。そのリンク・ポインタのブロッキングは、チェーン内の最初のリンクを指し示すポインタを戻し、これが削除されるリンクに該当する。次に、リンクを削除するステップ、すなわち共通非アトミック・プロシージャが実行され、ブロックされたリンク・ポインタのビュー・オブジェクトの参照を受け渡す。
【０２０１】
removeAfterArbitraryLink()：
ミューテータが最初にリセットされ、現リンクを有さないことを保証する。指定された任意のリンクが前リンクとなる。ミューテータはそのリンク内の順方向ポインタをブロックし、それが成功裡にブロックされるまで必要に応じて待機及び再試行する。そのリンク・ポインタのブロッキングは任意のリンクの直後に続く、削除されるリンクを指し示すポインタを返却する。次に、リンクを削除するステップ、すなわち共通非アトミック・プロシージャが実行され、ブロックされたリンク・ポインタの参照を受け渡す。
【０２０２】
removeArbitraryLink()：
リストのミューテータの非アトミック・ビューのために、前リンクを突き止め、その順方向ポインタをブロックすることが幾分関係する。次のステップが実行される。
【０２０３】
ａ）ミューテータのビュー・オブジェクトがリセットされ、現リンクを有さないことを保証する。
【０２０４】
ｂ）ミューテータが削除される任意のリンク内の逆方向ポインタをブロックし、それが成功裡にブロックされるまで必要に応じて待機及び再試行する。リンク・ポインタのブロッキングは、前リンクを指し示すポインタを戻す。このブロックは暫定的であり、ステップｄ）でまだ試行されていないブロックが、成功裡に行われない場合、延期されされる必要がある。ブロックされたリンク・ポインタ内のフラグ（図示せず）は、それが暫定的にブロックされていることを示す。
【０２０５】
ｃ）前リンク内の順方向ポインタが突き止められる。しかしながら、前リンクがNULLの場合、SharedChainオブジェクト内のfirst_link_pointerフィールド６０２が代わりに突き止められる。
【０２０６】
ｄ）ミューテータは、ステップｃ）で突き止められたリンク・ポインタをブロックしようとするが、それが成功するのを再試行または待機しない。ブロック試行が成功の場合には、ステップｅ）に継続する。それ以外では、リンク・ポインタが既に別の（ブロッキング）ミューテータによりブロックされたためにブロック試行が失敗する。ブロッキング・ミューテータは前リンクを削除しているか、その後に新たなリンクを挿入している。どちらの場合にも、ブロッキング・ミューテータは結局、ステップｂ）で暫定的にブロックされたリンク・ポインタをブロックする必要がある。リンク・ポインタが暫定的にブロックされていると判断するとき、ブロッキング・ミューテータはリンク転送機構を用いてリンク・ポインタの使用の許可を待機する。このミューテータはリンク転送機構を用いてブロックされたリンク・ポインタを延期し、ブロッキング・ミューテータに使用許可を与える一方、ステップｂ）で行われたブロックを保存する。ブロックされたリンク・ポインタの使用許可を受信すると、ブロッキング・ミューテータは前リンクを指し示すポインタを与えられる。このミューテータは次にリンク転送機構を用いて、ブロッキング・ミューテータが終えるのを待機し、その時点でブロッキング・ミューテータが再開の許可を与え、新たな前リンクを指し示すポインタを受け渡す。新たな前リンクを指し示すポインタにより、このミューテータはステップｃ）に戻り、その中の順方向リンク・ポインタを再度ブロックするように試行する。
【０２０７】
ｅ）この時点で、前リンクの順方向ポインタ内のブロックが成功裡に行われ、もはやステップｂ）で行われたブロックが暫定的である理由は存在しない。ブロックされたリンク・ポインタ内のフラグがオフされ、もはや暫定的でないことを示す。
【０２０８】
ｆ）リンクを削除するステップ、すなわち共通非アトミック・プロシージャが実行され、ブロックされたリンク・ポインタの参照を受け渡す。
【０２０９】
removeCurrentLink()：
ミューテータの現リンクがNULLの場合、削除するリンクは存在せず、この機能は失敗するはずである。それ以外では、次のステップが実行され、現リンクを削除しようとする。この機能は失敗し、ミューテータを新たな現リンクに預ける可能性があるが、"チェーン内のその場所"は維持される。
【０２１０】
ａ）ミューテータのビュー・オブジェクト内のcurPtrフィールド７０５が、前リンク内の順方向リンク・ポインタを指し示す。ミューテータはこのリンク・ポインタをブロックしようとするが、その成功のための再試行または待機は行わない。ブロック試行が成功裡に行われると、ステップｂ）に継続する。それ以外では、ブロック試行は失敗する。なぜなら、別の（ブロッキング）ミューテータが既にリンク・ポインタをブロックしているからである。ブロッキング・ミューテータは、このミューテータがリンク・ポインタをブロックしようとして失敗したことを何も知らないが、結局、それを単にブロックされたリンク・ポインタに接続される反復ミューテータと見なすかもしれず、そうであれば、それが前進するのを待機する。デッドロックを回避するためにこのミューテータのビュー・オブジェクトは、ブロッキング・ミューテータの道筋から逸らされる。これを行うために、このミューテータのビュー・オブジェクトは、順方向に前進するのではなく、代わりにブロックされた順方向ポインタに向けて丁度前進しているように見られるように変更される。必要に応じてブロッキング・ミューテータは、このミューテータが前進したことを伝えられる。次に、このミューテータは、ブロッキング・ミューテータがそのリンク・ポインタをブロック解除するのを待機する。ブロックされたリンク・ポインタが、そのポインタを含むリンクを削除しようとしたミューテータによりブロックされた場合、ミューテータは前リンク内の順方向ポインタもブロックしているであろう。この場合、このミューテータのビュー・オブジェクトは、その前ポインタに向けて丁度前進しているように見られるように移動され、必要に応じてブロッキング・ミューテータに前進が伝えられる。このミューテータは次に、ブロッキング・ミューテータがそのリンク・ポインタをブロック解除するのを待機する。その時、ブロッキング・ミューテータはこの待機中のミューテータのビュー・オブジェクトを調査し、そのcurLink７０６を削除されたリンクの次のリンクを指し示すようにセットし（前進を完了する）、ブロックされたリンク・ポインタを待機していた反復ミューテータに対するように、このミューテータを呼び起こす。呼び起こされた時、このミューテータは新たなcurPtr７０５を有するが、同一のcurLink７０６を有する。次に、ステップａ）の先頭に戻ることにより削除が再試行される。しかしながら、ブロックされたリンク・ポインタが、そのポインタを含むリンクを削除しようとしないミューテータによりブロックされた場合には、このミューテータのビュー・オブジェクトは、ブロックされたリンク・ポインタに向けて丁度前進しているように見られるように移動され、必要に応じてブロッキング・ミューテータに前進が伝えられる。次に、このミューテータは、ブロッキング・ミューテータがそのリンク・ポインタをブロック解除するのを待機する。その時、ブロッキング・ミューテータはこの待機中のミューテータのビュー・オブジェクトを調査し、そのcurLink７０６を削除されたリンクの次のリンクを指し示すようにセットし（前進を完了する）、ブロックされたリンク・ポインタを待機していた反復ミューテータに対するように、このミューテータを呼び起こす。呼び起こされた時、このミューテータはチェーン内の同一の位置を保持するが（すなわち、そのビュー・オブジェクト内のcurPtr７０５が変更されない）、新たな現リンクを有するので挿入機能を再試行することは意味がない。代わりにそれは存在して、失敗指示をクライアントに戻し、クライアントはgetCurrentLink()機能を呼び出し、新たな現リンクを調査し、何を行うかを決定する。
【０２１１】
ｂ）この時点で、前リンク内の順方向ポインタは成功裡にブロックされている。ミューテータのビュー・オブジェクトがリセットされ、現リンクを有さないことを保証する。これは潜在的なデッドロックを回避するために必要であり、現リンクは削除するリンクを識別するためにもはや必要とされない。ミューテータの現リンクは、後に必要に応じて再確立される。
【０２１２】
ｃ）リンクを削除するステップ、すなわち共通非アトミック・プロシージャが実行され、ブロックされたリンク・ポインタの参照を受け渡す。
【０２１３】
removeAfterCurrentLink()：
ミューテータの現リンクがNULLの場合、この機能は失敗するはずである。それ以外では、次のステップが実行され、現リンクの直後のリンクを削除しようとする。この機能は失敗し、ミューテータを新たな現リンクに預ける可能性があるが、"チェーン内のその場所"は維持される。
【０２１４】
ａ）ミューテータのビュー・オブジェクト内のcurLinkフィールド７０６が、現リンクを指し示す。ミューテータは、現リンク内の順方向リンク・ポインタをブロックしようとする。リンク・ポインタが、そのリンクを削除しようとするミューテータによりブロックされない限り、ミューテータはブロック試行を必要に応じて待機し、再試行する。ブロック試行が成功裡に行われると、ステップｂ）に継続する。それ以外では、ブロック試行は失敗する。なぜなら、別の（ブロッキング）ミューテータが既にリンク・ポインタをブロックしており、それを含むリンク（このミューテータの現リンク）を削除することをコミットしているからである。ブロッキング・ミューテータはまた、前リンク（このミューテータのcurPtr７０５が指し示すリンク）内の順方向ポインタをブロックしたであろう。ブロッキング・ミューテータは、このミューテータがリンク・ポインタをブロックしようとして失敗したことを何も知らないが、結局、それを単にブロックされたリンク・ポインタに接続される反復ミューテータと見なすかもしれず、そうであれば、それが前進するのを待機する。デッドロックを回避するために、このミューテータのビュー・オブジェクトは、ブロッキング・ミューテータの道筋から逸らされる。これを行うために、このミューテータのビュー・オブジェクトは、順方向に前進するのではなく、代わりに（curPtrが指し示す）前リンク内のブロックされた順方向ポインタに向けて、丁度前進しているように見られるように変更される。必要に応じてこのミューテータが前進したことが、ブロッキング・ミューテータに伝えられ、ミューテータはブロッキング・ミューテータがそのリンク・ポインタをブロック解除するのを待機する。ブロッキング・ミューテータがリンク・ポインタをブロック解除するとき、ブロッキング・ミューテータはこの待機中のミューテータのビュー・オブジェクトを調査し、そのcurLink７０６を新たな現リンクを指し示すようにセットし（前進を完了する）、（ブロックされたリンク・ポインタを待機していた反復ミューテータに対するように）このミューテータを呼び起こす。呼び起こされた時、このミューテータはチェーン内のその同一の位置を保存するが（すなわち、そのビュー・オブジェクト内のcurPtr７０５が変更されない）、新たな現リンクを有するので削除機能を再試行することは意味がない。代わりにそれは存在して失敗指示をクライアントに戻し、クライアントはgetCurrentLink()機能を呼び出し、新たな現リンクを調査し、何を行うかを決定する。
【０２１５】
ｂ）ミューテータがその現リンクを保存しない場合、ミューテータのビュー・オブジェクトがリセットされる。ミューテータが新たな現リンクを有する場合、それが後に再度確立される。
【０２１６】
ｃ）リンクを削除するステップ、すなわち共通非アトミック・プロシージャが実行される。
【０２１７】
リンクの削除、共通非アトミック・プロシージャ：
ここまで来て、前リンク内の順方向ポインタの参照が入力パラメータとして渡される。このリンク・ポインタは既にブロックされており、削除されるリンクをアトミックに識別し、削除されているリンクを指し示すようにブロッカ・オブジェクト内のnext_linkフィールド８０２をセットする。ブロックされた順方向リンク・ポインタに遭遇するインスペクタは、それを通じて前進し、削除されているリンクを見い出す。削除されるリンクを指し示すポインタがNULLの場合には、削除されるリンクは存在しない。その場合、以下のステップがスキップされ、プロセスは後述の"リンクの挿入または削除、共通非アトミック・プロシージャ"に継続し、前リンク内の順方向ポインタをブロック解除し終了する。それ以外では、次のステップが実行され、リンクを削除する。
【０２１８】
ステップ１：ミューテータが、削除されているリンク内の逆方向ポインタ１００３を突き止め、このミューテータがまだそれをブロックしてない場合、今それをブロックし、必要に応じて待機及び再試行する。このミューテータがそれを既にブロックしている唯一のケースは、任意のリンクを削除する場合に相当する。（逆方向リンク・ポインタが、ある他のミューテータによりブロックされる場合、それがブロック解除されるのを待機するにおいてデッドロックは存在しない。すなわち、第１に、逆方向ポインタが暫定的にブロックされることがない。なぜなら、リンク内の逆方向ポインタを暫定的にブロックできた機能だけが（SharedChainオブジェクト内のlast_link_pointerフィールド６０３ではない）、そのリンクを任意のリンクとして参照する機能であるからであり、従って、そうすることは、リンクが削除されているので無効であるからである。第２に、リンク内の逆方向ポインタをブロックしたミューテータは、前リンク内の順方向ポインタを既にブロックしており、もはやこのケースは有り得ず、唯一の可能性は、ミューテータが前リンク内の順方向ポインタを既にブロック解除しており、対象となる逆方向ポインタをブロック解除しようとすることである。）
【０２１９】
ステップ２：前リンクのブロックされた順方向ポインタ１００２を指し示すポインタが、ブロッカ・オブジェクト内のprevious_link_pointerフィールド１００１に記憶される。これは一旦リンク・ポインタがステップ３でブロックされると必要とされ、他の反復ミューテータが、削除されているリンクの道筋を避けるようにバックアップすることを可能にする。
【０２２０】
ステップ３：ミューテータが、削除されているリンク内の順方向ポインタ１００４を突き止め、それをブロックする。リンク・ポインタのブロッキングは、次のリンクを指し示すポインタを戻す。ミューテータはまた、ブロッカ・オブジェクト内のnext_linkフィールド８０２を次のリンクを指し示すようにセットする。それにより、以後、非アトミック・インスペクタは、ブロックされたリンク・ポインタを通じて前進し、次のリンクを突き止めることができ、削除されるリンクをスキップする。（このリンクをブロックする間に待機が必要な場合、そうするための特殊なインタフェースが存在し、これは後述のリンク転送機構に関連する。）
【０２２１】
ステップ４：ミューテータは、ブロックされたリンク・ポインタに依存する前進中の非アトミック・イテレータ（インスペクタまたはミューテータ）が、それを越えて前進するのを待機する。これらはリンク・ポインタがブロックされる前に、それらに到達したイテレータである。
【０２２２】
ステップ５：次のリンク内の逆方向ポインタが突き止められる。しかしながら、次のリンクがNULLの場合、削除されるリンクは、リスト内の最後のリンクである。その場合、SharedChainオブジェクト内のlast_link_pointerフィールド６０３が突き止められる。
【０２２３】
ステップ６：ミューテータは、ステップ５で突き止められたリンク・ポインタをブロックし、それが成功裡にブロックされるのを必要に応じて再試行または待機する。しかしながら、リンク・ポインタが別のミューテータにより暫定的にブロックされる場合、ミューテータはリンク・ポインタをブロックしようとしない。代わりに、ミューテータはリンク転送機構を用いてリンク・ポインタの使用許可を待機する。（それをブロックしたミューテータは、リンク転送機構を用いて、リンク・ポインタのブロックを延期し、その使用許可を与え、再開の許可を待機する。）
【０２２４】
ステップ７：チェーン内のリンクのカウントが減分される。
【０２２５】
ステップ８：削除されているリンク内の順方向リンク・ポインタ及び逆方向リンク・ポインタ（及び定義されている場合、任意のチェーン・ポインタ）がNULLにセットされる。
【０２２６】
ステップ９：後述の"リンクの挿入または削除、共通非アトミック・プロシージャ"に記載されるステップが実行され、削除プロセスを終了する。
【０２２７】
リンクの挿入または削除、共通非アトミック・プロシージャ：
ステップ１：この時点で、必要に応じてミューテータのための新たな現リンクが確立（または再確立）される。ミューテータのビュー・オブジェクトがチェーンに安全に接続される唯一の場所は、前リンク内のブロックされた順方向リンク・ポインタに至る。curPtrフィールド７０５は、その順方向リンク・ポインタを指し示すようにセットされ、curLinkフィールド７０６は、その順方向ポインタが後にブロック解除されるとき、それが指し示すリンクを指し示すようにセットされる。より詳細には、リンクが削除さている場合、ミューテータの現リンクは、削除されているリンクの直後のリンクを指し示すようにセットされる。また、リンクが挿入されている場合には、ミューテータの現リンクは、新たに挿入されるリンクを指し示すようにセットされる。注）insertAfterCurrentLink()機能またはremoveAfterCurrentLink()機能では、ミューテータはその現リンクを保存しているかもしれない。それはそのまま維持されるか、新たに挿入されたリンク、または削除されたリンクに続くリンクを指し示すように変更される。或いは、必要に応じてミューテータが非アクティブ状態にリセットされる。）
【０２２８】
ステップ２：前リンク内の順方向リンク・ポインタがブロック解除され、それを次のリンクを指し示すように変更するか（リンクが削除された場合）、新たなリンクを指し示すように変更する（リンクが挿入された場合）。リンク・ポインタのブロック解除は、それをアトミックに変更し、リンク・ポインタがブロックされたときに含んでいた値を戻す。ブロックされたリンク・ポインタは、他の反復またはブロッキング・ミューテータが、リンク・ポインタがブロック解除されるのを待機しているか否かを示す追加のフラグを含む。しかしながら、考慮されなければならないある特殊なケースが存在する。ブロックされた順方向リンク・ポインタを含むリンクを削除しようとするブロッキング・ミューテータが、そのリンク・ポインタがブロック解除されるのを待機している場合、そのリンク・ポインタはブロック解除されない。代わりに、ブロックされた順方向リンク・ポインタが、それを含むリンクを削除しようとする他のミューテータ（ｘ０９ビットのオンにより、そのブロッカ・オブジェクトを指し示す）により、ブロックされているように見られるように（アトミックに）更新される。次に、リンク転送機構の使用により、リンク・ポインタの使用許可がミューテータに与えられ、次のリンクを指し示すポインタ（リンク・ポインタをブロック解除する時、そこに配置されたはずの値）を受け渡す。
【０２２９】
ステップ３：次のリンク内の逆方向リンク・ポインタがブロック解除され、それを前リンクを指し示すように変更するか（リンクが削除された場合）、新たなリンクを指し示すように変更する（リンクが挿入された場合）。リンク・ポインタのブロック解除は、それをアトミックに変更し、リンク・ポインタがブロックされたときに含んでいた値を戻す。ブロックされたリンク・ポインタは、他のブロッキング・ミューテータがリンク・ポインタがブロック解除されるのを待機しているか否かを示す追加のフラグを含む。しかしながら、リンク・ポインタがこのミューテータによりブロックされておらず、代わりにある他のミューテータにより暫定的にブロックされる場合、リンク・ポインタはブロック解除されてはならない。代わりに、他のミューテータはリンク・ポインタのその使用を延期し、再開の許可を待機する。その場合、リンク転送機構の使用により、再開の許可がミューテータに与えられ、新たな前リンクを指し示すポインタ （リンク・ポインタをブロック解除する時、そこに配置されたはずの値）を受け渡す。（リンクを削除するとき、前リンク内の順方向リンク・ポインタをブロックした後に、削除されるリンクが存在しないと判断されるケースが存在する。これらの場合、次のブロック内には、ブロックされた逆方向リンク・ポインタが存在せず、従ってこのステップは完全にスキップされるべきである。）
【０２３０】
ステップ４：前リンク内の順方向リンク・ポインタがブロック解除されるのを待機中の反復ミューテータが存在する場合、それらが今呼び起こされる。それらはSharedChainオブジェクト内にある、非アトミック・ミューテータのビュー・オブジェクト７０１のリストを探索することにより見い出される。
【０２３１】
ステップ５：リンク・ポインタのどちらかがブロック解除されるのを待機しているブロッキング・ミューテータが存在する場合、それらが呼び起こされる。それらは全てSharedChainオブジェクト内にあるポインタ８０３から開始して、ブロッカ・オブジェクトのリストを探索することにより見い出される。
【０２３２】
ステップ６：この時点で、挿入機能または削除機能が完了する。ブロッカ・オブジェクトは、呼び起こされた他のインスペクタ及びミューテータがもはやそれを参照しない場合、直ちに別のミューテート機能のために再利用可能になる。
【０２３３】
非アトミック・ミューテータの現リンクの考察：
デッドロックを開始するため、非アトミック・ミューテータはミューテート機能を実行中にリセットされ（或いは、少なくともそのビュー・オブジェクトが内部的にリセットされ）、現リンクを有さないようにしなければならない（但し、insertAfterCurrentLink()機能及びremoveAfterCurrentLink()機能を除く）。ミューテータがミューテート機能を通じてチェーン内のその場所を確保する見込みがある唯一の方法は、機能の完了時に新たな現リンクを再確立することを許可することである。また、新たなリンクに安全になり得る唯一のリンクは、ミューテータがその場所を確保することを許可するリンクであることも真実である。ミューテータの状態は、先に定義されたMutatorControl値により制御される。
【０２３４】
リンク・リスト構造：内部詳細：
このセクションでは、非アトミック・ビューとブロッカ・オブジェクトとの間の、及びブロッカ・オブジェクト間の対話の詳細について述べる。前述の内部操作のセクションで述べた大きなピクチャではなく、このセクションはここの対話に着目する。特定の対話が大きなピクチャに当てはまる箇所を確認するためには、前述の内部操作のセクションを再度参照されたい。前述の実施例を更に理解するために、幾つかの追加の例及び図面が参照される。
【０２３５】
データ領域及び定義：
リンク・ポインタ：
前述のように、チェーン内のリンクのアドレスは複数バイトから成るので、少なくとも下位Ｎビットが０である（好適な実施例の環境では、Ｎが４で、バイト数は１６であるが、他の値も使用可能であり、或いはアドレス内のフラグの代わりに専用フラグ・フィールドなどの他の機構も使用可能である）。これらの同一のＮビットは、ブロッカ・オブジェクトのアドレス内でも０であり、従って、フラグとして使用される。表９は、チェーン内のリンク・ポインタ内の各フラグ・ビットの意味を示す。
【表９】
リンク・ポインタ内のフラグ・ビットの重要度：
[ビット]  ｘ０１
[意味]  ブロック化リンク・ポインタ
[説明]  オンの時、このフラグはリンク・ポインタがブロックされていることを示し、下位Ｎビットのマスクをオフすると、それをブロックしたミューテータに属するブロッカ・オブジェクトを指し示すポインタを生成する。残りのフラグ・ビットは、このビットがオンの時だけオンとなる。
[ビット]  ｘ０２
[意味]  反復ミューテータ待機
[説明]  オンの時、このフラグは少なくとも１つの反復ミューテータが、リンク・ポインタがブロック解除されるのを待機（または待機準備）していることを示す。ブロック解除ミューテータがリンク・ポインタをブロック解除し、このフラグを確認するとき、非アトミック・ミューテータのビュー・オブジェクトのリストを探索し、このリンク・ポインタがブロック解除されるのを待機するとコミットしたミューテータのいずれかを呼び起こす。このフラグは順方向リンク・ポインタ内でのみ使用される。
[ビット]  ｘ０４
[意味]  ブロッキング・ミューテータ待機
[説明]  オンの時、このフラグは少なくとも１つのブロッキング・ミューテータが、リンク・ポインタがブロック解除されるのを待機（または待機準備）していることを示す。ブロック解除ミューテータがリンク・ポインタをブロック解除し、このフラグを確認するとき、ブロッカ・オブジェクトのリストを探索し、これがそのリンク・ポインタをブロック解除するのを待機するとコミットしたあらゆるミューテータを呼び起こす。このビットは、順方向または逆方向リンク・ポインタのいずれかにおいてオンとなり得る。順方向リンク・ポインタでは、後述のｘ０８ビットと関連して、特殊な意味を有する。
[ビット]  ｘ０６
[意味]  暫定ブロック
[説明]  逆方向リンク・ポインタ内でオンの時、このフラグはリンク・ポインタ上に存在するブロックが暫定的であり、延期され得ることを示す。
[ビット]  ｘ０８
[意味]  削除保留
[説明]  順方向リンク・ポインタ内でオンの時、このフラグは順方向ポインタを含むリンクが削除されようとしてしていることを示す。リンクを削除しようとするミューテータは、前リンク内の順方向ポインタをブロックしている。このビットの正確な意味はｘ０４ビットの設定に依存する。すなわち、ｘ０４ビットがオフの時、これはリンク・ポインタをブロックしたミューテータがリンクを削除しようとするミューテータであることを示す。ｘ０４ビットがオンの時、これはリンク・ポインタをブロックすることを待機中のミューテータ（１つだけ存在し得る）が、リンク・ポインタのブロックに成功するとき、リンクを削除しようとすることを意味する。
【０２３６】
リンク・ポインタの更新は、リンク・ポインタの現行値を知ることによりアトミックに行われる。好適な実施例では、compareAndSwap()と呼ばれる特殊なシステム機能がこれを行うために使用される。更に一部のケースでは、compareAndSwapQualified()と呼ばれる特殊なシステム機能が使用される。この後者の機能は、単一のポインタのスワップを行うが、大きな記憶セグメント（４倍長ワード）を比較し、操作の間に大きな記憶セグメントの一部が変化している場合、失敗指示を提供する。類似の機能が他のシステムで使用されてもよいし、アトミシティすなわち原子性の代替手段がリンク・ポインタ更新操作の間に使用されてもよい。
【０２３７】
非アトミック・ビュー・オブジェクト：
非アトミック・イテレータ（インスペクタまたはミューテータ）がアクティブ状態または遷移状態の時、それに関連付けられるビュー・オブジェクトが存在する。ビュー・オブジェクトは、イテレータの現リンクを追跡する２つのフィールドを含む。イテレータがチェーンを通じて前進するとき、これらのフィールドが明確な態様で更新されなければならない。これらはあらゆる時点において把握されなければならない。なぜなら、ミューテータはいつの時点でもリンク・ポインタをブロック及びブロック解除しているかもしれず、所与のビュー・オブジェクトが興味の対象であるか否かを決定する必要があるからである。
【０２３８】
curPtr７０５：
このフィールドは、順方向リンク・ポインタを指し示すポインタを含む。これが突き止める順方向リンク・ポインタは、現リンク内または前リンク内に存在する。好適な実施例では、リンク内の全てのリンク・ポインタが８バイト境界上にあり、従って、それらのアドレスの少なくとも下位３ビットは０である。curPtrフィールド内において、これらのビットは表１０に示すように、フラグとして使用される。
【表１０】
curPtr内のフラグ・ビットの重要度：
[ビット]  ｘ０１
[意味]  コミット済み待機者
[説明]  オンの時、このフラグはcurPtrが指し示すリンク・ポインタをブロックしたミューテータが、このビュー・オブジェクトが属するイテレータが、ブロックされたリンク・ポインタを越えて前進するのを待機するとコミットしたことを示す。
[ビット]  ｘ０２
[意味]  優先順位バンプ
[説明]  このフラグは、ｘ０１フラグ・ビットがオンのときだけオンとなる。オンの時、これはイテレータを待機するとコミットしたミューテータが、イテレータのタスクの優先順位をバンプ（bump）したことを示す。
[ビット]  ｘ０４
[意味]  削除待機
[説明]  このフラグは、ｘ０１フラグ・ビットがオンのときだけオンとなる。オンの時、これは待機中のミューテータがイテレータの現リンクであるリンクを削除しようとしていることを示す。この場合、イテレータは、２つのリンクを前進するまで（技術的にはcurPtrを２度更新するまで）、ミューテータに自分が前進したことの通知を延期するべきである。
【０２３９】
curLink７０６：
このフィールドは、イテレータの現リンクを指し示すポインタを含む。リンクは１６バイト境界上に配置されなければならないので、それらのアドレスの少なくとも下位４ビットが０である。curLinkフィールド内において、これらのビットの３ビットは、表１１に示すように、フラグとして使用される。
【表１１】
curLink内のフラグ・ビットの重要度：
[ビット]  ｘ０１
[意味]  コミット済み待機者
[説明]  オンの時、このフラグは、イテレータがブロックされたリンク・ポインタに遭遇し、それがブロック解除されるのを待機することをコミットしたことを示す。リスト内のリンクを指し示す代わりに、このビットがオンの時、curLink（下位４ビットのマスクをオフする）は、curPtrにより突き止められた順方向リンク・ポインタをブロックしたミューテータに属するブロッカ・オブジェクトを指し示す。このフラグはミューテータのビュー・オブジェクト内でだけオンとなり、インスペクタは待機することなく、ブロックされたリンク・ポインタを通じて前進できる。
[ビット]  ｘ０２
[意味]  優先順位バンプ
[説明]  このフラグは、ｘ０１フラグ・ビットがオンのときだけオンとなる。オンの時、これは待機中のイテレータが、ブロッキング・ミューテータのタスクの優先順位をバンプしたことを示す。
[ビット]  ｘ０４
[意味]  優先順位非バンプ
[説明]  このフラグは、ｘ０１フラグ・ビットがオンのときだけオンとなる。オンの時、これは待機中のイテレータが、ブロッキング・ミューテータのタスクの優先順位をバンプする必要があると判断したことを示す。
【０２４０】
前記のビット・フラグの他に、curLinkフィールド７０６に現れる２つの特殊値が存在する。
【表１２】
curLink内の特殊値：
[値]  x00..02
[意味]  遷移
[説明]  この特殊値は、イテレータの前進の途中でcurPtrがセットされたが、curPtrの参照解除の結果がまだcurLinkにセットされていないことを示す。curLink内のこの値を見たブロッキング・ミューテータは、curPtrの参照解除が既に発生したか否かを知ることができない。
[値]  x00..04
[意味]  不一致
[説明]  curPtrが指し示すリンク・ポインタをブロックまたはブロック解除したミューテータが、curLink内の遷移値を見るとき、（ミューテータの見解からは、）それが前進中のイテレータがcurLinkに記憶しようしている、リンク・ポインタの旧値か新値かを見分けることができない。従って、ミューテータは、イテレータがcurPtrから参照解除したものを記憶する前に、curLinkを不一致値に変更し、それを記憶しようとするイテレータの試行を失敗させようとする。イテレータがcurLinkの変更に失敗するとき、イテレータは再度記憶を試行する前に、curPtrを参照解除する。このようにして、ミューテータは、イテレータがcurPtrから参照解除し、curLinkに記憶する値を確かめることができる。
【０２４１】
これらのフィールドは、compareAndSwap()機能を介して、アトミックに更新される。この機能は両方のフィールドを１つのアトミック操作により更新できないので、compareAndSwapQualified()機能が使用されて、１度に１つのフィールドを更新するが、いずれかのフィールドがその間に更新される場合、失敗する。
【０２４２】
更に、非アトミック・ビュー・オブジェクトはpriority_bump_uncertainty_resolverオブジェクトを有する。これは単一タスク・ブロッカ・オブジェクトであり、すなわち、１つのタスクにだけ影響する同期機構である。これは、ミューテータがイテレータのタスクの優先順位をバンプしたか否かが不確かな時に、優先順位バンプが確実になるまで待機するために使用される。これは優先順位バンプの前に優先順位アンバンプ（unbump）の発生を防止するために実行される。
【０２４３】
ブロッカ・オブジェクト：
（アトミックまたは非アトミック）ミューテータがミューテート機能を実行しているとき、それに関連付けられるブロッカ・オブジェクトが存在する。ブロッカ・オブジェクトは、その状態を定義する幾つかのフィールドを含む。
【０２４４】
活動化Ｉｄ：
ブロッカ・オブジェクトがミューテータに割当てられる度に、このフィールドは固有の番号（SharedChainオブジェクトに対して固有である）を割当てられる。インスペクタがリンク・ポインタがブロックされることを知ると、２度目に、それがまだブロックされているいるか否かを確認するとき、活動化Ｉｄフィールドを比較して、実際にまだブロックされているか、或いは２度目にブロックされたかを知る。このフィールドは、ミューテータがブロッカを用いてリンク・ポインタをブロックする前に割当てられる。
【０２４５】
次のリンク：
このフィールドは、リスト内の次のリンクを指し示すポインタを含み、主にインスペクタが、ブロックされた順方向リンク・ポインタを通じて前進することを許可する。このフィールドは実際、２つのフィールド、すなわち１次フィールド及び２次フィールドから成る。両者はリンクが削除されているときに、フィールドがアトミックにセットされるように見せるために必要とされる。イテレータが次のリンクに向けて前進しているときにブロックされたリンク・ポインタに遭遇すると、通常１次フィールドを用いて次のリンクを見い出す。しかしながら、ブロックされたリンク・ポインタが、それをブロックしたミューテータにより削除されるリンク内に存在する場合、イテレータは２次フィールドを用いて、次のリンクを見い出す。
【０２４６】
ブロッカ待機：
このフィールドは、ブロッカ・オブジェクトを使用中のミューテータが、第２のブロッカ・オブジェクトを使用している第２のミューテータのリンク・ポインタをブロック解除するために待機中であることを示すために使用される。通常、このフィールドはNULLを含み、ミューテータが待機していないことを示す。第２のミューテータを待機または待機準備しているとき、その第２のミューテータのブロッカ・オブジェクトを指し示すポインタが、このフィールドに記憶される。ブロッカ・オブジェクトのアドレスの下位Ｎビットは０である。このフィールドにおいて、下位３ビットはフラグとして使用される。表１３は、ブロッカ・アドレスが記憶されるときの様々なフラグ・ビットを示す。
【表１３】
ブロッカ・フラグ・ビットの待機：
[ビット]  ｘ００
[意味]  アンコミット
[説明]  全てのフラグ・ビットがオフの時、ミューテータは第２のミューテータを待機する準備中であるが、まだ待機することをコミットしていない。
[ビット]  ｘ０１
[意味]  コミット
[説明]  このフラグ・ビットがオンの時、ミューテータは第２のミューテータを待機することをコミット済みである。
[ビット]  ｘ０２
[意味]  優先順位バンプ
[説明]  このフラグは、ｘ０１フラグ・ビットがオンの時だけ、オンとなる。オンの時、これはミューテータが第２のミューテータのタスクの優先順位をバンプしたことを示す。
[ビット]  ｘ０４
[意味]  優先順位非バンプ
[説明]  このフラグは、ｘ０１フラグ・ビットがオンの時だけ、オンとなる。オンの時、これはミューテータが、第２のミューテータのタスクの優先順位をバンプすることが必要であると判断したことを示す。
【０２４７】
前リンク・ポインタ：
このフィールドは、ブロッカ・オブジェクトを使用しているミューテータが、リンクを削除している時にだけ使用される。前リンク内の順方向ポインタをブロックした後、ミューテータはそのリンク・ポインタを指し示すポインタをこのフィールドに記憶し、削除されているリンク内の順方向ポインタを続いてブロックする。第２のミューテータは、curPtrが第１のミューテータによりブロックされることを知り（第１のミューテータは、curPtrが指し示す順方向ポインタを含むリンクを削除しようとする）、その現リンクを削除する、またはその前に挿入する試行に失敗し、curPtrを前リンク内の順方向ポインタを指し示すように変更する必要がある。このフィールドは反復ミューテータが、前リンク内の順方向ポインタを見い出すことを可能にする。
【０２４８】
ステータス制御：
これは状態カウンタ・オブジェクト、すなわち特定事象により増分または減分されるカウンタであり、その時、タスクはカウンタがある値に達するのを待機してもよい。ブロッカ・オブジェクトと非アトミック・ビュー・オブジェクトとの間の待機／ウェイクアップ対話を制御するのは基本機構である。これについては以下で詳述する。
【０２４９】
延期リンク制御：
これもまた状態カウンタ・オブジェクトであり、延期リンク・ポインタと一緒に使用されるときのリンク転送機構の心臓部である。これについては以下で詳述する。
【０２５０】
ブロック化削除制御：
これもまた状態カウンタ・オブジェクトであり、リンクを削除するときのリンク転送機構の心臓部である。これについても以下で詳述する。
【０２５１】
優先順位バンプ・カウント：
このフィールドは、ミューテータのタスクの優先順位が待機者によりバンプされた回数を累算するために使用される。ミューテータは、全ての待機者が呼び起こされた後、最終的にそれ自身の優先順位をアンバンプする。
【０２５２】
非アトミック・ビュー及びブロッカ対話状況：
図１５及び図１６は、２つの反復ミューテータのビュー・オブジェクトと、２つのブロッキング・ミューテータのブロッカ・オブジェクトとの対話の例を示し、全ては同一のリンク・ポインタに作用する。この状況は次のように発生する。
【０２５３】
ステップ１：ビュー・オブジェクト１１０１を使用するミューテータが、最初に、"リンクＡ"内の順方向ポインタ１１１１に到達し、"リンクＢ"をその現リンクにする。そのcurPtrフィールド１１１２は、"リンクＡ"内の順方向ポインタ１１１１を指し示し、そのcurLinkフィールド１１１３は"リンクＢ"を指し示す。
【０２５４】
ステップ２：次に、ブロッカ・オブジェクト１１０３が到来し、"リンクＡ"と"リンクＢ"との間にリンクを挿入しようとし、"リンクＡ"内の順方向ポインタ１１１１をブロックし、そのｘ０１ビットに当たるブロック化リンク・ポインタ・フラグをセットする。次に、全てのビュー・オブジェクトを一覧し、同じ順方向リンク・ポインタに接続されたビュー・オブジェクト１１０１を見い出し、curPtr１１１２内のｘ０１コミット済み待機者フラグ、及びｘ０２優先順位バンプ・フラグをセットする。それにより、ビュー・オブジェクト１１０１を有するイテレータが前進するのを待機することをコミットし、イテレータのタスクの優先順位をバンプしたことを示す。
【０２５５】
ステップ３：その間に、ビュー・オブジェクト１１０２を使用するミューテータが、"リンクＡ"内の順方向リンク・ポインタ１１１１に到来し（そのcurPtrをリンクＡを指し示すようにセットする）、それがブロッカ・オブジェクト１１０３を使用するミューテータによりブロックされていることを見い出す。ミューテータは、"リンクＡ"内の順方向ポインタ１１１１内のｘ０２反復ミューテータ待機フラグをセットし、（１つ以上の）反復ミューテータが待機していることを示す。最後に、ミューテータは、curLink１１１５をブロッカ・オブジェクト１１０３を指し示すようにセットし、更にｘ０１コミット済み待機者フラグ及びｘ０４優先順位非バンプ・フラグをセットして、ブロッカ・オブジェクト１１０３を使用するミューテータが、"リンクＡ"内の順方向リンク・ポインタ１１１１をブロック解除するのを待機することをコミットしたこと、及びそのミューテータのタスクの優先順位をバンプすることが必要でないと判断したことを示す。
【０２５６】
ステップ４：最後に、ブロッカ・オブジェクト１１０４を使用するミューテータもまた、"リンクＡ"内の順方向リンク・ポインタ１１１１をブロックしたいと思うが、それがブロッカ・オブジェクト１１０３を使用するミューテータにより既にブロックされていることを見い出す。ミューテータは、"リンクＡ"内の順方向ポインタ１１１１内のｘ０４ブロッキング・ミューテータ待機フラグをセットし、（１つ以上の）ブロッキング・ミューテータが待機していることを示す。最後に、ミューテータは、そのブロッカ・オブジェクト１１０４内のブロッカ待機フィールド１１１６をセットして、ブロッカ・オブジェクト１１０３を指し示し、更にｘ０１コミット済み待機者フラグ及びｘ０２優先順位バンプ・フラグをセットして、ブロッカ・オブジェクト１１０３を使用するミューテータがそのリンク・ポインタをブロック解除するのを待機することをコミットしたこと、及びそのミューテータのタスクの優先順位をバンプしたことを示す。
【０２５７】
図１５及び図１６は、前記ステップを実行後のポインタの状態を示す。後に、ビュー・オブジェクト１１０１を使用するミューテータがその現リンクを完了して、次のリンクに前進するとき、ｘ０１コミット済み待機者フラグ及びｘ０２優先順位バンプ・フラグを見て、ブロッカ・オブジェクト１１０３を使用するミューテータ（すなわち、"リンクＡ"内の順方向リンク・ポインタ１１１１をブロックした）に、自分が前進したことを伝え、それ自身のタスクの優先順位をアンバンプする。すると、そのミューテータが起きあがり新たなリンクの挿入を終え、最終的に、そのリンク・ポインタをブロック解除する。次に、反復ミューテータ及びブロッキング・ミューテータの両者が待機中であることを確認し（すなわち、ブロックされた順方向リンク・ポインタ１１１１内のｘ０２反復ミューテータ待機フラグ、及びｘ０４ブロッキング・ミューテータ待機フラグがオン）、SharedChainオブジェクト内のそれらのリストを通じて、それらのビュー・オブジェクト及びブロッカ・オブジェクトを見い出す。ビュー・オブジェクト１１０２に新たな現リンクを与え（そのcurLink１１１５を"リンクＡ"内の順方向リンク・ポインタ１１１１のブロック解除時にセットした同一値にセットする）、そのミューテータを呼び起こす。またブロッカ・オブジェクト１１０４内のブロッカ待機フィールド１１１６をNULLにセットし、そのミューテータを呼び起こす。すると、呼び起こされたミューテータが再度リンク・ポインタをブロックしようと試みる。その間に、ブロッカ・オブジェクト１１０３を使用するミューテータが、自身のタスクの優先順位をアンバンプし、ブロッカ・オブジェクト１１０４を使用するミューテータから受信した優先順位バンプを取り消す。
【０２５８】
SharedChainオブジェクト：
チェーン内の最初と最後のリンクを指し示すポインタの他に、SharedChainオブジェクトは、次に示すような状態情報を含む多くのフィールドを有する。
【０２５９】
非アクティブ・リンク・ポインタ：
このフィールドはNULLを含み、８バイト境界上に配列される。ビュー・オブジェクトが非アクティブ状態の時、そのcurPtr７０５フィールドがこのフィールドのアドレスを含み、curLink７０６はNULLである。このように、非アクティブ・ビュー・オブジェクトに関する何か特殊なものは存在しない。それを見たブロッキング・ミューテータは直ちにそれを無視する。なぜなら、curPtr内の固有値は、そのミューテータにとって関心のある順方向リンク・ポインタのアドレスに決して一致しないからである。従って、ビュー・オブジェクトを特殊なケースとして扱うことなく、ブロッキング・ミューテータの道筋から逸らすことは、便利な方法である。
【０２６０】
１次及び２次ブロッカ・リスト・ヘッド：
これらのフィールドは、ブロッカ・オブジェクトのリスト内の最初のブロッカ・オブジェクトを指し示すポインタである。これらのフィールドの１つだけが、いつの時点においても有効である。ブロッカ・オブジェクトのリストは、単独リンク・リストである。新たなブロッカ・オブジェクトが作成されるとき、compareAndSwap()機能が、新たなブロッカ・オブジェクトをリストの先頭にアトミックに挿入するために使用される。しかしながら、後に不要なブロッカ・オブジェクトを削除するには、チェーン先頭の１度のアトミック更新では処理されず、このことは、ブロッカ・オブジェクトが依然必要とされないことを保証する。代わりに、有効なチェーン先頭を示す標識の１度のアトミック更新が要求される。
【０２６１】
１次及び２次インスペクタ・ビュー・リスト・ヘッド：
これらのフィールドは、インスペクタのビュー・オブジェクトのリスト内の最初のビュー・オブジェクトを指し示すポインタである。これらのフィールドは、primary_blocker_list_headフィールド及びsecondary_blocker_list_headフィールドが管理されるのと同様に管理される。
【０２６２】
１次及び２次ミューテータ・ビュー・リスト・ヘッド：
これらのフィールドは、ミューテータのビュー・オブジェクトのリスト内の最初のビュー・オブジェクトを指し示すポインタである。これらのフィールドは、primary_blocker_list_headフィールド及びsecondary_blocker_list_headフィールドが管理されるのと同様に管理される。
【０２６３】
活動化ブロッカ及びビュー・カウント：
このフィールドは、現在活動化されているブロッカ・オブジェクト及びビュー・オブジェクトの数を表す、２つの別々のカウンタとして使用される１つの整数を含み、上位ビットは、活動化されたブロッカ・オブジェクトの数を表すカウンタとして使用され、下位ビットは、活動化されたビュー・オブジェクトの数を表すカウンタとして使用される（インスペクタ及びミューテータの両者に対して合計される）。両方の部分は、１つのアトミック・フィールドとして更新される。ブロッカ部分は、ブロッカ・オブジェクトがミューテータに割当てられる前に１増分され、他のブロッカ・オブジェクトまたはビュー・オブジェクトによるそのブロッカ・オブジェクトの残りの参照がもはや存在しなくなると１減分される。ビュー部分は、ビュー・オブジェクトがイテレータ（インスペクタまたはミューテータ）に割当てられる前に１増分され、イテレータがリセットされた後、１減分される。各部分の最上位ビットは、カウントの一部としては使用されず予約される。これらの予約ビットの１つは、reclaim()機能が進行中であることを示すフラグとして使用される。（リクレームは、不要なブロッカ・オブジェクトまたはビュー・オブジェクトを削除するプロセスである。）このプロセスは、フィールド全体が０のときにだけ開始される（アクティブなブロッカ・オブジェクト及びビュー・オブジェクトが存在せず、リクレームがまだ進行中でない）。
【０２６４】
ブロッカ及びビュー存在カウント：
このフィールドは、現存するブロッカ・オブジェクト及びビュー・オブジェクトの数を表す、２つの別々のカウンタとして使用される１つの整数を含む。上位ビットは、現存するブロッカ・オブジェクトの数を表すカウンタとして使用され、下位ビットは、現存するビュー・オブジェクトの数を表すカウンタとして使用される（インスペクタ及びミューテータの両者に対して合計される）。両方の部分は、１つのアトミック・フィールドとして更新される。ブロッカ部分は、新たなブロッカ・オブジェクトが作成されなければならないとき１増分される（これはactivated_blocker_and_view_countフィールドのブロッカ部分を増分した後、しかしブロッカ・オブジェクトを作成し、それをリストの先頭に追加する前に行われる）。ビュー部分は、新たなビュー・オブジェクトが作成されなければならないとき１増分される（これはactivated_blocker_and_view_countフィールドのビュー部分を増分した後、しかしビュー・オブジェクトを作成し、それを適切なリストの先頭に追加する前に行われる）。両方の部分は、reclaim()機能によってのみ減分される。各部分の最上位ビットは、カウントの一部としては使用されずフラグとして使用される。ブロッカ部分のフラグは、それが有効なprimary_blocker_list_headフィールドか、secondary_blocker_list_headフィールドかを示す。ビュー部分内のフラグは、それが有効なprimary_view_existence_countフィールドか、secondary_view_existence_countフィールド（後述）かを示す。フラグはreclaim()機能により、必要に応じてトグルされる。activated_blocker_and_view_countフィールド及びblocker_and_view_existence_countフィールドは、１つのアトミック・フィールドとして一緒に更新されることはない。しかしながら、これらは同一の４倍長ワード内に存在し、個々にcompareAndSwapQualified()機能により更新される。その間にどちらかのフィールドが変更されると、この機能は失敗する。
【０２６５】
１次及び２次ビュー存在カウント：
これらのフィールドの１つだけが１度に有効である。どちらが有効かは、前述のblocker_and_view_existence_countフィールドのビュー部分内のフラグにより示される。これらのフィールドの各々は、２つの別々のカウンタとして使用される１つの整数を含む。各フィールドの上位ビットは、インスペクタの現存のビュー・オブジェクトの数を表すカウンタとして使用され、各フィールドの下位ビットは、ミューテータの現存のビュー・オブジェクトの数を表すカウンタとして使用される。両方の部分は、１つのアトミック・フィールドとして更新される。新たなビュー・オブジェクトが作成されなければならないとき、（インスペクタまたはミューテータのための）適切なカウンタが１増分される（これはblocker_and_view_existence_countフィールドの合計カウントを増分し、ビュー・オブジェクトを作成し、それを適切なリストの先頭に追加した後に行われる）。両方の部分は、reclaim()機能によってのみ減分される。各部分の最上位ビットは、カウントの一部としては使用されずフラグとして使用される。インスペクタ部分内のフラグは、それが有効なprimary_inspector_view_list_headフィールドか、それともsecondary_inspector_view_list_headフィールドかを示す。ミューテータ部分内のフラグは、それが有効なprimary_mutator_view_list_headフィールドか、それともsecondary_mutator_view_list_headフィールドかを示す。フラグはreclaim()機能により、必要に応じてトグルされる。
【０２６６】
アクティブ・インスペクタ・ビュー・カウント：
このアトミック・フィールドは、非アトミック・インスペクタのアクティブ・ビュー・オブジェクトの数のカウントを含む。このフィールドは、インスペクタのビュー・オブジェクトが非アクティブ状態からチェーン内のリンクに移動される前に１増分され、ビュー・オブジェクトがチェーン内のリンクから、非アクティブ状態に戻された後で１減分される。このフィールドの目的は、ミューテータがビュー・オブジェクトのリストと対話しなければならない回数を低減することである。すなわち、ミューテータがリンク・ポインタをブロックし、インスペクタのビュー・オブジェクトを調べる必要があるとき、ミューテータはこのフィールドが非ゼロである場合のみ、そうする必要がある。このフィールドは、特定のビュー・オブジェクトのためにだけ増分または減分され、これはactivated_blocker_and_view_countフィールドのビュー・オブジェクト部分が、その同一のビュー・オブジェクトのために増分された後に、及び同一のビュー・オブジェクトのために減分される前に行われる。
【０２６７】
アクティブ・ミューテータ・ビュー・カウント：
このアトミック・フィールドは、非アトミック・ミューテータのアクティブ・ビュー・オブジェクトの数のカウントを含む。このフィールドは、ミューテータのビュー・オブジェクトが、非アクティブ状態からチェーン内のリンクに移動される前に１増分され、ビュー・オブジェクトがチェーン内のリンクから、非アクティブ状態に戻された後で１減分される。このフィールドの目的は、ミューテータがビュー・オブジェクトのリストと対話しなければならない回数を低減することである。すなわち、ミューテータがリンク・ポインタをブロックし、ミューテータのビュー・オブジェクトを調べる必要があるとき、ミューテータはこのフィールドが非ゼロである場合のみ、そうする必要がある。このフィールドは、特定のビュー・オブジェクトのためにだけ増分または減分され、これはactivated_blocker_and_view_countフィールドのビュー・オブジェクト部分が、その同一のビュー・オブジェクトのために増分された後に、及び同一のビュー・オブジェクトのために減分される前に行われる。
【０２６８】
反復：
好適な実施例の環境では、ビュー・オブジェクト内のcurLink７０６及びcurPtr７０５フィールドが、１つのフィールドとしてアトミックに更新されない。これらは１つずつ更新されなければならなず、またブロッキング・ミューテータはこれらのフィールドをいつでも観察することができるので、全ての更新は、ビュー・オブジェクトの状態が、curLink及びcurPtrのあらゆる可能なスナップショット観察において正確に理解されるように行われなければならない。両方のフィールドは同一の４倍長ワード内にあるので、その間にどちらかのフィールドが更新されると、フィールドの１つを更新しようとするcompareAndSwapQualified()機能が失敗する。
【０２６９】
非アクティブ状態の非アトミック・イテレータ：
非アトミック・イテレータ（インスペクタまたはミューテータ）が非アクティブ状態の時には、ビュー・オブジェクトを有さない。イテレータに現在関連付けられている全てのビュー・オブジェクトも非アクティブと見なされる。非アクティブ・ユー・オブジェクトは、sharedChainオブジェクト内のinactive_link_pointerフィールドを指し示すcurPtr７０５、及びNULLにセットされたcurLinkを有する。
【０２７０】
ミューテータに属するビュー・オブジェクトも、一般にミューテート機能の間は非アクティブである。そのcurLink７０６フィールド及びcurPtr７０５フィールドが、前述のようにセットされ、active_inspector_view_countフィールド、またはactive_mutator_view_countフィールド（適宜）は、そのために増分されない。
【０２７１】
非アトミック・イテレータ（インスペクタまたはミューテータ）のチェーン内の最初のリンクへの前進：
この処理が開始するとき、イテレータは非アクティブ状態であると仮定される。処理を完了するためのステップは、次のようである。
【０２７２】
ステップ１：プリエンプトを禁止する。
【０２７３】
ステップ２：activated_blocker_and_view_countフィールドのビュー部分を１増分する。適切なリスト内で使用可能なビュー・オブジェクトを見い出す。どれも使用可能でない場合、blocker_and_view_existence_countフィールドのビュー部分を増分し、新たなビュー・オブジェクトを作成し、それを適切なリストの先頭に追加し、primary_view_existence_countフィールドまたはsecondary_view_existence_countフィールド（どちらか有効な方）の、インスペクタまたはミューテータ部分（適宜）を増分する。
【０２７４】
ステップ３：active_inspector_view_countフィールド、またはactive_mutator_view_countフィールド（適宜）を１増分する。
【０２７５】
ステップ４：ビュー・オブジェクトのcurLinkフィールド７０６を特殊な遷移値（000...002）にセットする。現時点では、curPtrフィールド７０５がSharedChainオブジェクト内のinactive_link_pointerフィールドを指し示すので、どのミューテータもビュー・オブジェクトに関心がない。しかしながら、これは次のステップで重要となり、最初にセットされなければならない。
【０２７６】
ステップ５：ビュー・オブジェクトのcurPtr７０５を、SharedChainオブジェクト内のfirst_link_pointerフィールドを指し示すように変更する。そのリンク・ポインタをブロックまたはブロック解除しているミューテータは、今ビュー・オブジェクトに関心を持つことになる。curLink７０６内の特殊な遷移値により、そのミューテータは、イテレータがcurPtrを参照解除することにより獲得する値によりcurLinkをセットしようとしていることを知る。ミューテータは、参照解除が発生したか否かを知るすべが無く、もし発生した場合には、それがミューテータがリンク・ポインタをブロックまたはブロック解除した前に発生したのか、後に発生したのかを知ることもできない。従って、ミューテータは、イテレータがどのような値をcurLink内にセットしたかを知らない。これを回避するために、ミューテータはcurLinkを特殊な不一致値（00...04）に変更しようとする。ミューテータが成功すると、イテレータはcurPtrからcurLinkに参照解除するものをセットする試行を失敗し、再度curPtrを参照解除する。このように、ミューテータは、自身がリンク・ポインタに加えた変更をイテレータが見たことを確認できる。
【０２７７】
ステップ６：チェーン内の最初のリンクへの移動は、あるリンクから次のリンクに前進するより一般的なプロセスの特殊ケースに相当する。この時点で、フロントエンド特殊ケース・ステップが完了し、処理はより一般的なプロセスへと継続する。これがインスペクタの場合、処理は"非アトミック・インスペクタの次のリンクへの前進"（後述）のステップ３に継続する。ミューテータの場合には、処理は"非アトミック・ミューテータの次のリンクへの前進"（後述）のステップ４に継続する。
【０２７８】
（任意のリンクに続くリンクへのイテレータの移動も同様である。前記のステップ５において、curPtrをSharedChainオブジェクト内のfirst_link_pointerを指し示すようにセットする代わりに、任意のリンク内の順方向リンク・ポインタを指し示すようにセットすればよい。）
【０２７９】
非アトミック・インスペクタの次のリンクへの前進：
インスペクタが現リンクを有する間、そのビュー・オブジェクト内において、curLinkフィールドはそのリンクを指し示し、curPtrフィールドはその現リンク内の順方向ポインタを指し示す。前進するために両方のフィールドはチェーン内の次のリンクに対して同じ相対位置に達する。curPtrにより突き止められる順方向リンク・ポインタは、現在ブロックされているかもしれないし、そうでないかもしれない。次のステップが実行される。
【０２８０】
ステップ１：プリエンプトを禁止する。
【０２８１】
ステップ２：curLinkを特殊な遷移値にセットする。curPtrが指し示すリンク・ポインタをブロックまたはブロック解除しているミューテータは、この値を見ると、インスペクタがcurPtrを参照解除することにより獲得する値により、curLinkをセットしようとしていることを知る。ミューテータは、参照解除が発生したか否かを知るすべが無く、もし発生した場合には、それがミューテータがリンク・ポインタをブロックまたはブロック解除した前に発生したのか、後に発生したのかを知ることもできない。従って、ミューテータは、インスペクタがどのような値をcurLink内にセットしたかを知らない。これを回避するために、ミューテータはcurLinkを特殊な不一致値に変更しようとする。ミューテータが成功すると、インスペクタは、ステップ８でcurLinkをセットするのに失敗し、再度curPtrを参照解除する。このように、ミューテータは、自身がリンク・ポインタに加えた変更をインスペクタが見たことを確認できる。
【０２８２】
ステップ３：curPtrを参照解除し、リンク・ポインタの内容を獲得する。リンク・ポインタがブロックされない場合、ステップ８に移行する。それ以外では、ステップ４に継続する。
【０２８３】
ステップ４：リンク・ポインタがブロックされ、それをブロックしたミューテータに属するブロッカ・オブジェクトを指し示すポインタを含む。ブロッカ・オブジェクトから活動化Ｉｄを獲得し、後の使用のためにそれを保管する。リンク・ポインタが、ブロックされたリンク・ポインタを含むリンクを削除しようとするミューテータによりブロックされる場合、secondary_next_link_fieldを獲得し、それを後の使用のために、次のリンク・ポインタとして保管する。それ以外では、primary_next_link_fieldを獲得し、それを代わりに保管する。
【０２８４】
ステップ５：curPtrを再度、参照解除する。リンク・ポインタがもはやブロックされない場合、ステップ８に移行する。
【０２８５】
ステップ６：リンク・ポインタが依然ブロックされるか、再度ブロックされる。ブロッカ・オブジェクトから活動化Ｉｄフィールドを獲得する。活動化Ｉｄが以前に獲得されたものとは同一でない場合、リンク・ポインタが再度ブロックされたことになる。この場合、ステップ４に移行する。
【０２８６】
ステップ７：活動化Ｉｄが同じであり、ステップ４で抽出されたprimary_next_linkフィールドまたはsecondary_next_linkフィールドが、次のリンクを指し示すポインタである。（その間にリンク・ポインタをブロックしたミューテータは、それをブロック解除しているかもしれない。ブロック解除するとき、リンク・ポインタにセットする値は、primary_next_linkフィールドまたはsecondary_next_linkフィールドから抽出された値と同一である。従って、この場合、抽出値は依然有効である。しかしながら、ミューテータがリンク・ポインタをブロック解除した後、それが別のブロッカ活動化により再度ブロックされた場合、抽出値はもはや正しくないかもしれない。しかしながら、他のブロッカ活動化を使用するミューテータは、そのリンク・ポインタをブロック解除する前に対話しなければならないビュー・オブジェクトを探索し、問題のリンク・ポインタを突き止めるcurPtrによりこれを見い出す。そのミューテータは、ミューテータまたはインスペクタが最初にcurLinkをセットするのに成功するか否かに応じて、このビュー・オブジェクトを使用するインスペクタが前進するのを待機するか、或いはcurLinkを特殊な不一致値に変更し、ステップ８でcurLinkをセットするインスペクタの試行を失敗させる。）
【０２８７】
ステップ８：compareAndSwap()機能を用いて、次のリンク・ポインタをcurLinkにセットしようとする。これはインスペクタの新たな現リンクとなり、ステップ３またはステップ５でcurPtrから参照解除される値であるか、ステップ４でprimary_next_linkフィールドまたはsecondary_next_linkフィールドから抽出された値である。compareAndSwap()機能が失敗する場合、これはあるミューテータがcurLinkを期待遷移値から不一致値に変更したことによる。失敗の場合、ステップ２に戻り、処理を継続する。
【０２８８】
ステップ９：新たな現リンクがNULLの場合、チェーンの終わりに達したことを示す。その場合、処理は"非アトミック・イテレータ（インスペクタまたはミューテータ）を非アクティブ状態にリセット"（後述）のステップ２に継続する。
【０２８９】
ステップ１０：新たな現リンクがNULLでない場合、新たな現リンクが確立される。compareAndSwap()機能を用いて、curPtrを新たな現リンク内の順方向ポインタを指定するように変更する一方、curPtrの旧値を確かめる。curPtrの旧値のｘ０４削除待機フラグがオンの場合、curPtrの新たな値のセットに際してｘ０１コミット済み待機者フラグ、及びｘ０２優先順位バンプ・フラグも含まれる。試行が失敗の場合、このステップはそれが成功するまで繰り返される。
【０２９０】
ステップ１１：ステップ１０で獲得されたcurPtrの旧値において、ｘ０１コミット済み待機者フラグがオンでない場合、このインスペクタの前進を待機中のミューテータは存在しない。その場合、ステップ１９に移行する。それ以外では、ステップ１２に継続する。
【０２９１】
ステップ１２：ｘ０１コミット済み待機者フラグが、curPtrの旧値においてオンであり、ミューテータは前進の通知を待機する。ｘ０４削除待機フラグもオンの場合、前進の通知は次の前進まで延期される必要がある。その場合、ステップ１７に移行する。それ以外では、ステップ１３に継続する。
【０２９２】
ステップ１３：ｘ０４削除待機フラグがオフであり、ミューテータはこの時を知らされる必要がある。curPtrの旧値は、ミューテータがブロックしたリンク・ポインタを指し示し、従って、そのリンク・ポインタからミューテータのブロッカ・オブジェクトを指し示すポインタを獲得し、それに前進を知らせる。
【０２９３】
ステップ１４：curPtrの旧値において、ｘ０２優先順位バンプ・フラグがオンの場合、待機中のミューテータが、インスペクタのタスクの優先順位をバンプしたことが示される。その場合、ステップ１６に移行する。それ以外では、ステップ１５に継続する。
【０２９４】
ステップ１５：curPtrの旧値において、ｘ０２優先順位バンプ・フラグがオフであり、これは待機中のミューテータが、インスペクタのタスクの優先順位をバンプしたことを示す機会を有する前に、インスペクタがcurPtrを変更したことを意味する。ミューテータがバンプする前に、インスペクタがそれ自身のタスクの優先順位をアンバンプしないことを保証するために、ビュー・オブジェクト内のpriority_bump_uncertainty_resolver（単一タスク・ブロッカ・オブジェクト）を待機する。（ミューテータがcurPtr内のｘ０２優先順位バンプ・フラグをセットしようと試み、curPtrが変化したことを確認すると、ビュー・オブジェクトのpriority_bump_uncertainty_resolverをブロック解除する。）待機中のインスペクタが起きると、それはそのタスクの優先順位がバンプされたことを確認する。
【０２９５】
ステップ１６：インスペクタのタスクの優先順位をアンバンプする。ステップ１９に移行し、処理を継続する。
【０２９６】
ステップ１７：この時点で、通知されるべき待機中のミューテータが存在するが、curPtrの旧値において、ｘ０４削除待機フラグがオンなので、通知が次の前進まで延期される。（そうするように、フラグがステップ１０でセット済みである。）curPtrの旧値において、ｘ０２優先順位バンプ・フラグもオンの場合、待機中のミューテータが、インスペクタのタスクの優先順位をバンプしたことを示す。その場合、ステップ１９に移行する。それ以外では、ステップ１８に継続する。
【０２９７】
ステップ１８：curPtrの旧値において、ｘ０２優先順位バンプ・フラグがオフであり、これは待機中のミューテータが、インスペクタのタスクの優先順位をバンプしたことを示す機会を有する前に、インスペクタがcurPtrを変更したことを意味する。ミューテータがバンプする前に、インスペクタがそれ自身のタスクの優先順位をアンバンプしないことを保証するために、ビュー・オブジェクト内のpriority_bump_uncertainty_resolver（単一タスク・ブロッカ・オブジェクト）を待機する。（ミューテータがcurPtr内のｘ０２優先順位バンプ・フラグをセットしようと試み、curPtrが変化したことを確認すると、ビュー・オブジェクトのpriority_bump_uncertainty_resolverをブロック解除する。）待機中のインスペクタが起きると、それはそのタスクの優先順位がバンプされたことを確認できる。（次回の前進時に、その時のcurPtrの旧値となるもののｘ０２優先順位バンプ・フラグを見て（ステップ１０でセット済み）、そのタスクの優先順位をアンバンプすることを知る。）
【０２９８】
ステップ１９：この時点で前進が完了し、プリエンプトが許可される。
【０２９９】
非アトミック・ミューテータの次のリンクへの前進：
ミューテータが現リンクを有する間、そのビュー・オブジェクト内において、curLinkフィールドはそのリンクを指し示し、curPtrフィールドは前リンク内の順方向ポインタを指し示す。前進するために、両方のフィールドは同じ相対位置に達するが、一方は更にチェーンに沿って進んでいる。curPtrにより突き止められる順方向リンク・ポインタは、現在ブロックされているかもしれないし、そうでないかもしれない。（非アトミック・ミューテータにより使用される他に、このコード経路は、非アトミック・インスペクタが非アクティブ状態にリセットされるときにも使用される。しかしながら、非アクティブ状態にリセットするとき、インスペクタはブロックされたリンク・ポインタに決して遭遇しない。インスペクタまたはミューテータにより使用される経路は、イテレータの見地から述べられ、ミューテータにしか当てはまらない経路は反復ミューテータの見地から述べられる。）
【０３００】
ステップ１：プリエンプトが禁止される。プロセスは、getNextLink()機能に対してだけ、このステップ（ステップ１）で開始する。他の全てのケースでは、後のステップに入力する。
【０３０１】
ステップ２：compareAndSwap()機能を用いて、curPtrを現存の現リンク内の順方向ポインタを指定するように変更する一方、curPtrの旧値を確かめる。curPtrの旧値のｘ０４削除待機フラグがオンで、このコード経路がgetNextLink()機能のために呼び出されている場合、curPtrの新たな値のセットに際してｘ０１コミット済み待機者フラグ、及びｘ０２優先順位バンプ・フラグも含まれる。（getNextLink()機能に関与しない場合、イテレータの前進に関する通知は、後の前進まで延期されてはならない。）
【０３０２】
ステップ３：curLinkを特殊な遷移値にセットする。curPtrが指し示すリンク・ポインタをブロックまたはブロック解除しているブロッキング・ミューテータは、curLink内のこの値を見ると、このイテレータがcurPtrを参照解除することにより獲得する値により、curLinkをセットしようとしていることを知る。ブロッキング・ミューテータは、参照解除が発生したか否かを知るすべが無く、もし発生した場合には、それがブロッキング・ミューテータがリンク・ポインタをブロックまたはブロック解除した前に発生したのか、後に発生したのかを知ることもできない。従って、ブロッキング・ミューテータは、イテレータがどのような値をcurLink内にセットしたかを知らない。そのため、ブロッキング・ミューテータはcurLinkを特殊な不一致値に変更しようとする。ブロッキング・ミューテータが成功すると、イテレータは、ステップ６でcurLinkをセットするのに失敗し、最初からやり直し、再度curPtrを参照解除する。このように、ブロッキング・ミューテータは、自身がリンク・ポインタに加えた変更をイテレータが見たことを確認できる。
【０３０３】
ステップ４：curPtrを参照解除し、リンク・ポインタの内容を獲得する。リンク・ポインタがブロックされない場合、ステップ６に移行する。それ以外では、ブロックされたリンク・ポインタを含むリンクを削除しようとするミューテータによりブロックされる場合（ｘ０８削除保留フラグがオンで、ｘ０４ブロッキング・ミューテータ待機フラグがオフ）、ステップ５に移行する。そうでない場合、リンク・ポインタがブロックされるが、リンク・ポインタを含むリンクは、現在それをブロックされたミューテータにより削除されていない。ブロックされたリンク・ポインタ内でｘ０２反復ミューテータ待機フラグが既にオンの場合、ステップ６に移行して処理を継続する。そうでない場合、ｘ０２反復ミューテータ待機フラグは、ブロックされたリンク・ポインタ内でオンではなく、compareAndSwap()機能を用いて、それをオンにセットしようとする。それが失敗すると、ステップ３に移行し、最初からやり直す。成功裡にオンにセットできる場合は、ブロッキング・ミューテータがそのリンク・ポインタをブロック解除するとき、このフラグを見て、ミューテータのビュー・オブジェクトを調べ、待機者を呼び起こす。次にステップ６に移行し、処理を継続する。
【０３０４】
ステップ５：この時点で、リンク・ポインタがブロックされたリンク・ポインタを含むリンクを削除しているミューテータによりブロックされる。ブロッキング・ミューテータはリンク・ポインタをブロックした時、次のリンク・ポインタを指し示すポインタを、そのブロッカ・オブジェクト内のsecondary_next_linkフィールドに記憶したので、その値を抽出して、次のリンク・ポインタとして使用する。（ブロッキング・ミューテータは最終的に、この反復イテレータが前進するのを待機し、そのブロッカ・オブジェクト内から次のリンク・ポインタを見い出すことは安全である。）
【０３０５】
ステップ６：compareAndSwap()機能を用いて、curLinkを期待遷移値から、ステップ４でcurPtrから参照解除された値（またはステップ５でブロッカ・オブジェクトから検索された値）に変更しようとする。（しかしながら、リンク・ポインタがブロックされた場合（ｘ０１ブロック化リンク・ポインタ・フラグがオン）、記憶される値は、ブロッカ・オブジェクトを指し示すポインタであり、curLinkに記憶するとき、ｘ０１フラグを除く全てのフラグをオフにセットする。curLink内のｘ０１フラグはコミット済み待機者フラグであり、これは反復ミューテータが、ブロッキング・ミューテータがそのリンク・ポインタをブロック解除するのを待機することをコミットしたことを示す。試行が失敗すると（なぜなら、その間にミューテータはcurLinkを特殊な不一致値に変更しているので）、ステップ３に戻り、最初からやり直す。
【０３０６】
ステップ７：この時点で、イテレータはその旧現リンクを成功裡に残す。（ステップ２から）ｘ０１コミット済み待機者フラグが、curPtrの旧値においてオンでない場合、このミューテータの前進の通知を待機中のブロッキング・ミューテータは存在しない。その場合、ステップ１５に移行し、それ以外では、ステップ８に継続する。
【０３０７】
ステップ８：ブロッキング・ミューテータが、前進の通知を待機中である。ｘ０４削除待機フラグがオンで、このプロセスがgetNextLink()機能の一部として実行される場合、前進の通知は次の前進まで延期される。その場合、ステップ１３に移行し、それ以外では、ステップ９に継続する。
【０３０８】
ステップ９：ｘ０４削除待機フラグがオフであり（或いは、イテレータがgetNextLink()機能を処理していない）、待機中のミューテータがこの時点に通知される。curPtrの旧値は、ミューテータがブロックしたリンク・ポインタを指し示すので、そのリンク・ポインタからミューテータのブロッカ・オブジェクトを指し示すポインタを獲得し、それに前進を通知する。
【０３０９】
ステップ１０：curPtrの旧値において、ｘ０２優先順位バンプ・フラグがオンの場合、待機中のミューテータは、イテレータのタスクの優先順位をバンプしたことを示す。その場合、ステップ１２に移行する。それ以外では、ステップ１１に継続する。
【０３１０】
ステップ１１：curPtrの旧値において、ｘ０２優先順位バンプ・フラグがオフであり、これは待機中のミューテータがイテレータのタスクの優先順位をバンプしたことを示す機会を有する前に、イテレータがcurPtrを変更したことを意味する。待機中のミューテータがバンプする前に、イテレータがそれ自身のタスクの優先順位をアンバンプしないことを保証するために、ビュー・オブジェクト内のpriority_bump_uncertainty_resolver（単一タスク・ブロッカ・オブジェクト）を待機する。（ミューテータがcurPtr内のｘ０２優先順位バンプ・フラグをセットしようと試み、curPtrが変化したことを確認すると、ビュー・オブジェクトのpriority_bump_uncertainty_resolverをブロック解除する。）待機中のイテレータが起きると、それはそのタスクの優先順位がバンプされたことを確認できる。
【０３１１】
ステップ１２：イテレータのタスクの優先順位をアンバンプする。ステップ１５に移行し、処理を継続する。
【０３１２】
ステップ１３：この時点で、通知されるべき待機中のミューテータが存在するが、通知は次の前進まで延期される。（そうするように、フラグがステップ１０でセット済みである。）curPtrの旧値において、ｘ０２優先順位バンプ・フラグがオンの場合、待機中のミューテータが、インスペクタのタスクの優先順位をバンプしたことを示す。その場合、ステップ１５に移行する（イテレータは次回前進するとき、ｘ０２優先順位バンプ・フラグに気づく）。それ以外では、ステップ１４に継続する。
【０３１３】
ステップ１４：curPtrの旧値において、ｘ０２優先順位バンプ・フラグがオフであり、これは待機中のミューテータがイテレータのタスクの優先順位をバンプしたことを示す機会を有する前に、イテレータがcurPtrを変更したことを意味する。ミューテータがバンプする前に、イテレータがそのタスクの優先順位をアンバンプしないことを保証するためにビュー・オブジェクト内のpriority_bump_uncertainty_resolver（単一タスク・ブロッカ・オブジェクト）を待機する。（ミューテータがcurPtr内のｘ０２優先順位バンプ・フラグをセットしようと試み、curPtrが変化したことを確認すると、ビュー・オブジェクトのpriority_bump_uncertainty_resolverをブロック解除する。）待機中のイテレータが起きると、それはそのタスクの優先順位がバンプされたことを確認する。（次回の前進時に、その時のcurPtrの旧値となるもののｘ０２優先順位バンプ・フラグを見て（ステップ２でセット済み）、そのタスクの優先順位をアンバンプすることを知る。）
【０３１４】
ステップ１５：ステップ６でcurLinkに記憶された値が、ブロッカ・オブジェクトを指し示すポインタでなかった場合（ｘ０１コミット済み待機者フラグがオフ）、イテレータはその前進を完了している。その場合、ステップ１７に移行し、それ以外では、ステップ１６に継続する。
【０３１５】
ステップ１６：反復ミューテータは、そのブロッカ・アドレスがcurLinkに記憶されるミューテータが、curPtrにより突き止められるリンク・ポインタをアンブロックするのを待機することをコミット済みである。後述の"待機及びウェイクアップ：ミューテータがそのリンク・ポインタをブロック解除することの待機"で述べる処理ステップが、ブロッキング・ミューテータのタスクの優先順位をバンプし、それがリンク・ポインタをブロック解除するのを待機するために実行される。ブロッキング・ミューテータがそのリンク・ポインタをブロック解除するとき、（ブロック解除された）順方向ポインタにセットした値と同じ値をcurLink内にセットし、反復ミューテータをウェイクアップする。ウェイクアップされると、反復ミューテータはその前進を完了する。
【０３１６】
ステップ１７：プリエンプトが許可される。
【０３１７】
非アトミック・イテレータ（インスペクタまたはミューテータ）の非アクティブ状態へのリセット：
クライアントにより要求されると（またはそのデストラクタが実行されると）、イテレータが非アクティブ状態にリセットされる（そのビュー・オブジェクトも非アクティブにされて、再利用のために使用可能にされる）。更にインスペクタがチェーンの終わりに前進するとき、それは非アクティブ状態にリセットされる。最終的に、ミューテータがミューテート機能を開始するとき、ミューテータのビュー・オブジェクトが非アクティブ状態にリセットされる。但し、依然ミューテータに関連付けられる。（ミューテート機能が完了するとき、ビュー・オブジェクトがアクティブ状態に戻される。）プロセスは次の通りである。
【０３１８】
ステップ１：プリエンプトが禁止される。
【０３１９】
ステップ２：前述の"非アトミック・ミューテータの次のリンクへの前進"で述べた処理ステップが、ステップ２から開始して実行される。但しステップ２において、curPtrが（現リンク内の順方向アドレスではなく）SharedChainオブジェクト内のinactive_link_pointerフィールドのアドレスにセットされる。このことはビュー・オブジェクトをチェーンから外れるように移動し、どのブロッカ・オブジェクトも以後はこれに関心を持たなくなる。（inactive_link_pointerフィールドはNULLを含むので、それがステップ４で参照解除されるとき、ブロックされるようには決してみられない。従って、リンク・ポインタがブロック解除されるための待機は存在しないが、ブロッキング・ミューテータは、イテレータがその現リンクから逸れて前進することを通知される必要があるかもしれない。）
【０３２０】
ステップ３：SharedChainオブジェクト内のactive_inspector_view_countフィールドまたはactive_mutator_view_countフィールドを、（適宜）１減分する。
【０３２１】
ステップ４：リセットされているのがビュー・オブジェクトだけの場合（及びイテレータ自身がアクティブまたは遷移状態のままである）、この処理が行われる。それ以外では、ステップ５が実行される。
【０３２２】
ステップ５：ビュー・オブジェクトが別のイテレータにより再利用されるように使用可能になる。SharedChainオブジェクト内のactivated_blocker_and_view_countフィールドのビュー部分を１減分する。このフィールド全体が０の場合、ビュー・オブジェクトまたはブロッカ・オブジェクトの未解決の参照がもはや存在しないことを意味する。従って、reclaim機能を呼び出し、過度なビュー・オブジェクトまたはブロッカ・オブジェクトを削除する。
【０３２３】
非アトミック・ミューテータのための新たな現リンクの確立または再確立：
insertAfterCurrentLink()機能及びremoveAfterCurrentLink()機能を除き、ミューテータがリンクを挿入または削除している間、それはビュー・オブジェクトを有さないか、そのミュー・オブジェクトが非アクティブ状態にリセットされる。機能がほとんど完了したが、リンク・ポインタがまだブロック解除されていないとき、ミューテータの現リンクが次のように確立または再確立される。
【０３２４】
ステップ１：ミューテータが既にビュー・オブジェクトを有する場合、ステップ２に移行する。それ以外では、以下を実行してビュー・オブジェクトを割当てる。すなわち、ａ）SharedChainオブジェクト内のactivated_blocker_and_view_countフィールドのビュー部分を１増分し、ｂ）ミューテータ・ビュー・オブジェクト・リスト内で使用可能なビュー・オブジェクトを見い出す。使用可能なものが存在しない場合、blocker_and_view_existence_countフィールドのビュー部分を１増分し、新たなビュー・オブジェクトを作成し、ミューテータ・ビュー・オブジェクト・リストの先頭に追加し（１次ヘッドまたは２次ヘッド（すなわち先頭）のいずれか有効な方を使用）、primary_view_existence_countフィールドまたはsecondary_view_existence_countフィールドの（いずれか有効な方の）ミューテータ部分を１増分する。
【０３２５】
ステップ２：SharedChainオブジェクト内のactive_mutator_view_countフィールドを１増分する。
【０３２６】
ステップ３：この時点で、ビュー・オブジェクトのcurLinkフィールドはNULLであり、そのcurPtrフィールドは、SharedChainオブジェクト内のinactive_link_pointerフィールドを突き止める。このビュー・オブジェクトは、それを見るかもしれないミューテータにとって、興味対象とならない。
【０３２７】
ステップ４：前リンク内の順方向ポインタが後にブロック解除されるとき、それが指し示すリンクを指し示すようにcurLinkを変更する。リンクを挿入する場合、これは新たに挿入されるリンクであり、一方、リンクを削除する場合、それは後に続くリンクである。curPtrは前のステップから変更されていないので、このビュー・オブジェクトは依然、ミューテータにとって興味対象ではない。
【０３２８】
ステップ５：curPtrを前リンク内の順方向ポインタを指し示すように変更する。この時点で、ビュー・オブジェクトは新たな現リンクを有し、リンク・ポインタがブロック解除された後に、そのリンクに前進する反復ミューテータの他のビュー・オブジェクトと何も違わない。
【０３２９】
非アトミック・ミューテータの現リンクの変更：
非アトミック・ミューテータがその現リンクに関連するミューテート機能を失敗するとき、それは第２のミューテータが既に、影響を受けるリンク・ポインタをブロックしていたことによる。第２のミューテータは第１のミューテータの意志に気づいておらず、第１のミューテータを反復ミューテータとして見るだけで、それが前進するのを待機する。第１のミューテータは反復ミューテータとして作用し、第２のミューテータの道筋から逸れ、それがリンク・ポインタをブロック解除するのを待機する。待機後、状況に応じて、ミューテータは新たな現リンクを有したり、有さなかったりする。有する場合、オリジナル機能が失敗する。なぜなら、それはオリジナル現リンクにもとづくからである。新たな現リンクを有さない場合には、オリジナル機能は再試行されてもよい。オリジナル削除機能または挿入機能は、オリジナル現リンクにもとづくので、失敗しなければならない。表１４は、機能、失敗の理由及び回復を示す。
【表１４】
失敗原因及び救済策：
[失敗機能]insertBeforeCurrentLink()またはremoveCurrentLink()
[失敗原因１]
（curPtrが指し示す）前リンク内の順方向ポインタが、その前リンクを削除しようとするミューテータによりブロックされる。
[回復]
リンク内の順方向ポインタを前リンクの前に後退させる。ミューテータはそのリンク・ポインタを同様にブロックし、それを指し示すポインタを、ブロッカ・オブジェクト内のprevious_link_pointerフィールドに記憶する。呼び起こされる時、curPtrは変更されているが、curLinkは変更されていない。失敗機能を再試行する。
[失敗原因２]
（curPtrが指し示す）前リンク内の順方向ポインタが、現リンクを削除しようとする、またはリンクをその前に挿入しようとするミューテータによりブロックされる。
[回復]
前リンク内の順方向ポインタを、curPtrが指し示す位置に後退させる。呼び起こされる時、curPtrは変更されていないが、curLinkは変更されている。失敗指示をクライアントに戻す。
[失敗機能]insertAfterCurrentLink()またはremoveAfterCurrentLink()
[失敗原因１]
（curPtrが指し示す）現リンク内の順方向ポインタが、現リンクを削除しようとするミューテータによりブロックされる。
[回復]
前リンク内の順方向ポインタを、curPtrが指し示す位置に後退させる。呼び起こされる時、curPtrは変更されていないが、curLinkは変更されている。失敗指示をクライアントに戻す。
【０３３０】
ブロックされたリンク・ポインタの後退：
ステップ１：ｘ０２反復ミューテータ待機フラグが、ブロックされたリンク・ポインタ内でオンでない場合、compareAndSwap()機能を用いて、それをセットしようとする。この試行が失敗すると、フラグがオンになるまで再試行する。第１のミューテータは第２のミューテータの道筋に立ちふさがっているので、第２のミューテータは第１のミューテータがその道筋から逸れて前進するまで、リンク・ポインタをブロック解除することができない。従って、compareAndSwap()機能は単にそれが成功するまで再試行される
【０３３１】
ステップ２：第１のミューテータのビュー・オブジェクト内のcurLinkフィールドを、第２のミューテータのブロッカ・オブジェクトを指し示すように変更する（ｘ０１コミット済み待機者フラグをオンする）。これは第１のミューテータが、第２のミューテータがそのリンク・ポインタをブロック解除するのを待機することをコミットしたことを示す。
【０３３２】
ステップ３：ｘ０１コミット済み待機者フラグがcurPtrフィールド上でオンの場合、compareAndSwap()機能を用いて、全てのフラグ・ビット（ｘ０７）をオフしようとする一方、どれがオンであったかを知る。この試行が成功しない場合（再２のミューテータがｘ０２優先順位バンプ・フラグをオンにセットしている）、このステップはそれが成功するまで再試行される。（ｘ０１コミット済み待機者フラグがオンでない場合、第２のミューテータはそれをオンにしない。なぜなら、ステップ２で行われた変更が、第１のミューテータが第２のミューテータを待機することをコミットしたように見せるからである。その場合、第２のミューテータは第１のミューテータを待機することをコミットしない。第２のミューテータが待機のコミット中であっても、ステップ２でのcurLinkの設定はそれを失敗させ、再試行時に、第２のミューテータは、第１のミューテータが自分を代わりに待機することをコミットしたことを知る。）
【０３３３】
ステップ４：ｘ０１コミット済み待機者フラグが、ステップ３でのcurPtrの旧値においてオンであることが見い出された場合、これは第２のミューテータが、第１のミューテータが前進するのを待機することをコミットしたことを示す。（第２のミューテータはｘ０２優先順位バンプ・フラグ、及びｘ０４削除待機フラグもセットしているかもしれない。しかしながら、前進の通知は延期されるべきでないので、ｘ０４削除待機フラグは無視される。）
【０３３４】
ステップ５：第２のミューテータがそのリンク・ポインタをブロック解除するのを待機する。"ミューテータがそのリンク・ポインタをブロック解除することの待機"（後述）の処理ステップは、第２のミューテータのタスクの優先順位をバンプし、それがリンク・ポインタをブロック解除するのを待機するために実行される。第２のミューテータがそのリンク・ポインタをブロック解除するとき、それは第１のミューテータのビュー・オブジェクトを見て、そのcurLinkフィールドを新たなリンク・ポインタによりセットし、第１のミューテータを呼び起こす。呼び起こされると、第１のミューテータはその新たな現リンクを有する。
【０３３５】
リンク・ポインタのブロッキング：
待機を伴わないリンク・ポインタのブロッキング：
この機能は、次の機能において、前リンク内の順方向ポインタをブロックするために使用される。すなわち、
insertBeforeCurrentLink()
removeCurrentLink()
insertArbitraryLink()（任意のリンク内の逆方向ポインタを暫定的にブロックした後）
removeArbitraryLink()（任意のリンク内の逆方向ポインタを暫定的にブロックした後）
insertLast()（SharedChainオブジェクト内の最後のリンク・ポインタを暫定的にブロックした後）
【０３３６】
この機能は、それを待機／再試行論理によりラッパする他のブロッキング機能によっても内部的に使用される。リンク・ポインタをブロックすることに関わるステップについて詳述する。本来、リンク・ポインタがまだブロックされていなければ、リンク・ポインタの旧値がスワップ・アウトされ、起動側に戻され、新たな値（フラグ・ビットがセットされてブロッカ・オブジェクトを指し示す）がスワップ・インされる。
【０３３７】
ステップ１：リンク・ポインタを参照解除し、その現内容を獲得する。それが別のミューテータによりブロックされる場合、機能は終了し、リンク・ポインタの現内容（ブロッキング・ミューテータのブロッカ・オブジェクトを指し示すポインタ）を戻して失敗を告げる。それ以外では、処理を継続する。
【０３３８】
ステップ２：削除されているリンク内にない順方向リンク・ポインタをブロックする場合、（ステップ１で捕獲された）リンク・ポインタの現内容を、primary_next_linkフィールドに記憶する。削除されているリンク内にある順方向リンク・ポインタをブロックする場合、リンク・ポインタの現内容をsecondary_next_linkフィールドに記憶する。（逆方向リンク・ポインタをブロックする場合には、ブロッカ・オブジェクト内に記憶するものは何も存在しない。）
【０３３９】
ステップ３：compareAndSwap()を用いて、リンク・ポインタをブロッカ・オブジェクトを指し示すように変更しようとする一方（適切なフラグがオンにセットされる）、リンク・ポインタの現内容を知る。操作が失敗すると、ステップ１に戻り、最初からやり直す。
【０３４０】
ステップ４：丁度ブロックされたリンク・ポインタが、削除されているリンク内の順方向リンク・ポインタの場合、secondary_next_linkフィールドをprimary_next_linkフィールドにコピーする。
【０３４１】
ステップ５：機能は終了し、（ステップ１で捕獲された）リンク・ポインタのオリジナル内容を戻す。これがブロッカ・オブジェクトの代わりにリンクを指し示す事実は、ここで試行されるブロック操作が成功したことを示す。
【０３４２】
待機を伴うリンク・ポインタのブロッキング：
この機能は、次の機能において、逆方向ポインタをブロックするために使用される。すなわち、
insertLast()
insertBeforeArbitraryLink()
removeArbitraryLink()
【０３４３】
この機能はまた、次の機能において、前リンク内の順方向ポインタをブロックするために使用される。
insertFirst()
insertAfterCurrentLink()
insertAfterArbitraryLink()
removeFirst()
removeAfterArbitraryLink()
【０３４４】
ブロッカ・オブジェクト内のブロッカ待機フィールドが最初にNULLに初期化され、ミューテータが現在待機中であることを示す。
【０３４５】
ステップ１：前述の"待機を伴わないリンク・ポインタのブロッキング"のプロシージャを呼び出し、リンク・ポインタをブロックしようとする。それが成功すると、プロシージャは終了し、リンク・ポインタのオリジナル内容（ブロックされていない）を戻す。それ以外では、ステップ２に継続する。
【０３４６】
ステップ２：リンク・ポインタが既に別のミューテータによりブロックされていたためにブロック試行が失敗し、その別のミューテータのブロック・オブジェクトを指し示すポインタが、失敗した試行により戻される。その第２のブロッカ・オブジェクトを指し示すポインタ（全てのフラグ・ビットがオフされる）を、第１のブロッカ・オブジェクト内のブロッカ待機フィールドに記憶する。どのフラグ・ビットもオンでない事実は、第１のミューテータが第２のミューテータを待機しようとしているが、まだそうするようにコミットしていないことを示す。
【０３４７】
ステップ３：再度ロックされるリンク・ポインタを参照解除する。それが同一のミューテータによりまだブロックされていない場合、ステップ１に戻り、最初からやり直す。（ステップ１に戻る際、ブロッカ待機フィールドがこの中間状態に維持されるが、何も害を及ぼさない。自身が指し示すブロッカ・オブジェクトを使用中のミューテータは、後にリンク・ポインタをブロック解除するとき、フィールドをNULLにリセットしてもよい。但し、NULLにセットするとき、どのフラグもセットされていないので、別のアクションは実行しない。
【０３４８】
ステップ４：ｘ０４ブロッキング・ミューテータ待機フラグが、ブロックされたリンク・ポインタ内でオンでない場合、compareAndSwap()機能を用いて、それをセットしようとする。操作が失敗すると、ステップ１に戻り、最初からやり直す。
【０３４９】
ステップ５：compareAndSwap()機能を用いて、ブロッカ待機フィールド内のコミット済み待機者フラグ（ｘ０１ビット）をセットしようとする。これは第１のミューテータが、第２のミューテータによるそのリンク・ポインタのブロック解除を待機することをコミットしたことを示す。試行が失敗する場合、これは第２のミューテータが既にリンク・ポインタをブロック解除しており、ブロッカ待機フィールドをNULLにリセットしたことによる。その場合、ステップ１に戻り、最初からやり直す。
【０３５０】
ステップ６：この時点で、第１のミューテータは第２のミューテータを待機することをコミット済みである。"ミューテータがそのリンク・ポインタをブロック解除することの待機"で述べる処理ステップが実行され、第２のミューテータのタスクの優先順位をバンプし、それがリンク・ポインタをブロック解除するのを待機しようとする。呼び起こされると、ステップ１に戻り、最初からやり直す。
【０３５１】
順方向リンク・ポインタの条件付きブロッキング：
このセクションは、現リンクの後に挿入または削除するとき、現リンク内の順方向ポインタをブロックする目的で使用される。
【０３５２】
ステップ１：前述の"待機を伴わないリンク・ポインタのブロッキング"のプロシージャを呼び出し、リンク・ポインタをブロックしようとする。成功の場合、プロシージャは終了し、リンク・ポインタのオリジナル内容（ブロックされていない）を戻し、成功を示す。それ以外では、ステップ２に継続する。
【０３５３】
ステップ２：ブロック試行が失敗し、リンク・ポインタのブロック化内容を戻す。リンク・ポインタが、ブロック化ポインタを含むリンクを削除しているミューテータによりブロックされる場合（ｘ０８削除保留フラグがオンで、ｘ０４ブロッキング・ミューテータ待機フラグがオフ）、プロシージャが終了し、リンク・ポインタのオリジナル内容（ブロックされていない）を戻し、失敗を示す。それ以外では、ステップ３に継続する。
【０３５４】
ステップ３：このリンク・ポインタが、それを含むリンクを削除する意志のない第２のミューテータによりブロックされる。前述の"待機を伴うリンク・ポインタのブロッキング"で述べたステップが実行され、リンク・ポインタがブロック解除されるのを待機する。これらのいずれかのステップが失敗するか、待機から起こされると、ステップ１に戻り、最初からやり直す。
【０３５５】
逆方向リンク・ポインタを暫定的にブロックした後の、順方向ポインタのブロッキング：
このセクションは、任意のリンクを削除するとき、または最後か、任意のリンクの前に挿入するとき、前リンク内の順方向ポインタをブロックするために使用される。逆方向ポインタは暫定フラグにより、既にブロックされている。
【０３５６】
ステップ１：前述の"待機を伴わないリンク・ポインタのブロッキング"で述べたプロシージャを呼び出し、リンク・ポインタをブロックしようとする。それが成功すると、ステップ４に移行する。それ以外では、ステップ２に継続する。
【０３５７】
ステップ２：ブロック試行が失敗し、リンク・ポインタを既にブロックしたミューテータのブロッカ・オブジェクトを指し示すポインタを戻す。第２のミューテータもまた、第１のミューテータが以前に暫定的にブロックしたのと同一のリンク・ポインタをブロックし、デッドロックを回避するために暫定ブロックが延期され、第２のミューテータがそれを使用できるようにする。暫定ブロックを延期するためにリンク転送機構が、第２のミューテータのブロッカ・オブジェクト内の延期リンク制御オブジェクトと共に使用され、第２のミューテータに対して暫定的にブロックされた逆方向ポインタが、それがブロックされる前にリンクを指し示すために使用したポインタを受け渡す。
【０３５８】
ステップ３：リンク転送機構が、失敗したミューテータのブロッカ・オブジェクト内の延期リンク制御オブジェクトと共に使用され、第２のミューテータが新たな前リンクを指し示すポインタを戻すのを待機する。次にステップ１に戻り、最初からやり直し、この新たな前リンク内の順方向ポインタをブロックしようとする。
【０３５９】
ステップ４：この時点で、順方向リンク・ポインタが成功裡にブロックされ、暫定的にブロックされた逆方向リンク・ポインタは、もはや暫定的である必要はない。compareAndSwap()機能を用いて、逆方向リンク・ポインタ内のｘ０６暫定フラグをオフしようとする。機能が失敗すると、それが成功するまで繰り返す。（別のミューテータがｘ０４ブロッキング・ミューテータ待機フラグをセットできる。）
【０３６０】
ステップ５：プロシージャが終了し、リンク・ポインタのオリジナル内容（ブロックされていない）を戻す。
【０３６１】
削除中のリンク内の順方向リンク・ポインタのブロッキング：
ステップ１：前述の"待機を伴わないリンク・ポインタのブロッキング"のプロシージャが呼び出され、リンク・ポインタをブロックしようとする。成功すると、プロシージャが終了し、リンク・ポインタのオリジナル内容（ブロックされていない）を戻す。それ以外では、このプロシージャはステップ２に継続する。
【０３６２】
ステップ２：第２のミューテータが既にリンク・ポインタをブロックしていたためにブロック試行が失敗する。CompareAndSwap()機能を用いて、ブロックされたリンク・ポインタ内のｘ０８削除保留フラグ及びｘ０４ブロッキング・ミューテータ待機フラグをセットしようとする。これが成功しない場合、ステップ１に戻り、最初からやり直す。それ以外では、ステップ３に継続する。
【０３６３】
ステップ３：この時点で、リンク・ポインタが第２のミューテータによりブロックされ、フラグがリンク・ポインタ内でセットされており、ブロックされたリンク・ポインタを含むリンクを削除しようとするミューテータが、そのリンク・ポインタがブロック解除されるのを待機中であることを示す。これが、第２のミューテータがリンク・ポインタをブロック解除するときに、認識される状態である。リンク転送機構をブロック化削除制御オブジェクトと共に使用し、第２のミューテータがリンク・ポインタをブロック解除するのを待機する。この場合、第２のミューテータはブロック解除せずに、待機中のミューテータのためにそれを"再ブロック"する（待機中のブロッカ・オブジェクトのアドレスをｘ０１ブロック化リンク・ポインタ及びｘ０８削除保留フラグをオンにして記憶する）。次に、リンク転送機構を用いて待機中のミューテータを呼び起こし、もし実際にブロック解除した場合に、リンク・ポインタ内に配置したはずの値を受け渡す。
【０３６４】
ステップ４：プロシージャが終了し、ステップ３でリンク転送機構を通じて獲得されたブロックされてないリンク・ポインタ値を戻す。
【０３６５】
最終リンク・ポインタのブロッキング：
リンクを削除するとき、または最初か、現リンクの後か、任意のリンクの後に挿入するとき、この機能が次のリンク内の逆方向ポインタをブロックするために使用される。これは、これらの場合においてブロックされる最後のリンク・ポインタである。
【０３６６】
ステップ１：前述の"待機を伴わないリンク・ポインタのブロッキング"のプロシージャが呼び出され、リンク・ポインタをブロックしようとする。成功すると、プロシージャが終了し、リンク・ポインタのオリジナル内容（ブロックされていない）を戻す。それ以外では、ステップ２に継続する。
【０３６７】
ステップ２：リンク・ポインタが既に第２のミューテータによりブロックされていたため、リンク・ポインタをブロックする試行は失敗する。リンク・ポインタが暫定的にブロックされていなかった場合には、ステップ３に進む。それ以外では、リンク・ポインタは第２のミューテータにより暫定的にブロックされており、第２のミューテータはそのブロックを延期し、リンク転送機構と第１のミューテータのブロッカ・オブジェクト内の延期リンク制御オブジェクトとを用いて、第１のミューテータに前リンクを指し示すポインタを受け渡す。そうすることで、リンク転送機構と第１のミューテータのブロッカ・オブジェクト内の延期リンク制御オブジェクトとを用いてリンク・ポインタを待機する。呼び起こされると、プロシージャは終了し、前リンクを指し示すポインタを戻す。
【０３６８】
ステップ３：この時点で、リンク・ポインタは第２のミューテータによりブロックされているが暫定的でない。"待機を伴うリンク・ポインタのブロッキング"で述べたのと同一のステップにより、リンク・ポインタがブロック解除されるのを待機する。これらのステップのいずれかが失敗するか、待機から起こされると、ステップ１に移行し、最初からやり直す。
【０３６９】
リンク・ポインタのブロック解除：
リンク・ポインタをブロック解除するとき、前リンク内の順方向ポインタが最初にブロック解除され、続いて、次のリンク内の逆方向ポインタがブロック解除される。
【０３７０】
前リンク内の順方向ポインタのブロック解除：
ステップ１：ブロック解除されるリンク・ポインタ内で、ｘ０４ブロッキング・ミューテータ待機フラグ及びｘ０８削除保留フラグの両方がオンの場合、それはブロックされた順方向ポインタを含むリンクを削除しようとするミューテータが、待機中であることを示す。その場合、ステップ２に進んで処理を継続する。それ以外では、compareAndSwap()機能を用いて、ブロックされたリンク・ポインタをその新たな次のリンクを指し示すポインタにより置換しようとする。試行が失敗する場合、それは他のミューテータが、ブロックされたリンク・ポインタ内のフラグをセットしていることによる。この場合、ステップ１の最初に戻りやり直す。試行が成功する場合、処理を終了し、リンク・ポインタの旧ブロック化値を戻す。これはｘ０２反復ミューテータ待機フラグまたはｘ０４ブロッキング・ミューテータ待機フラグがオンで、潜在的な待機者を探す必要があるか否かを示し得る。
【０３７１】
ステップ２：この時点で、ブロックされたリンク・ポインタを含むリンクを削除しようとするミューテータは、（リンク転送機構を介して）再開の許可を待機中である。そのミューテータはまた、同一のリンク内の逆方向ポインタをブロックするであろう。逆方向ポインタを突き止め、そこから、そのミューテータにより使用されるブロッカ・オブジェクトを突き止める。
【０３７２】
ステップ３：compareAndSwap()機能を用いて、ブロッカ・オブジェクトのアドレス（ｘ０１ブロック化リンク・ポインタ及びｘ０８削除保留フラグがオン）を、ブロックされたリンク・ポインタに記憶しようとする。試行が失敗する場合、これは他の反復ミューテータが、ブロックされたリンク・ポインタ内のｘ０２反復ミューテータ待機フラグをセットしているからであり、成功するまでこのステップをやり直す。一旦成功すると、リンク・ポインタは、そのリンク・ポインタ含むリンクを削除しようとする待機中のミューテータによりブロックされたと見られる。
【０３７３】
ステップ４：リンク転送機構と、待機中のミューテータのブロッカ・オブジェクト内のブロック化削除制御オブジェクトとを用いて、リンク・ポインタを待機中のミューテータに渡し、それを呼び起こす。
【０３７４】
ステップ５：処理を終了し、リンク・ポインタのブロック化値を戻す。ｘ０２反復ミューテータ待機フラグ及びｘ０４ブロッキング・ミューテータ待機フラグの両方が興味対象となり、潜在的な待機者を探す必要があるか否かを示す。
【０３７５】
次のリンク内の逆方向ポインタのブロック解除：
ステップ１：リンク・ポインタが暫定的にブロックされる場合、それは実際には異なるブロッカ・オブジェクトを用いて、異なるミューテータによりブロックされる。その場合、ステップ３に移行して処理を継続する。
【０３７６】
ステップ２：compareAndSwap()機能を用いて、ブロックされたリンク・ポインタを、新たな前リンクを指し示すポインタにより置換しようとする。試行が失敗する場合、それは別のブロッキング・ミューテータが、ブロックされたリンク・ポインタ内のｘ０４ブロッキング・ミューテータ待機フラグをセットしていることにより、成功するまでこのステップを繰り返す。成功するとき、処理を終了し、リンク・ポインタの旧（ブロック化）値を戻す。これはｘ０４ブロッキング・ミューテータ待機フラグがオンで、潜在的な待機者を探す必要があるか否かを示し得る。
【０３７７】
ステップ３：この時点で、リンク・ポインタは異なるミューテータにより暫定的にブロックされる。そのミューテータは、ブロックされたリンク・ポインタを延期しており、リンク転送機構をそのブロッカ・オブジェクト内の延期リンク制御オブジェクトと一緒に用いて、再開の許可を待機する。リンク転送機構を延期リンク制御オブジェクトと一緒に用いて、新たな前リンクを指し示すポインタ（ステップ２においてリンク・ポインタに配置したはずの同一の値）を受け渡す。これにより待機中のミューテータが起き上がり、新たな前リンク・ポインタを与えられる。
【０３７８】
ステップ４：処理を終了し、何も戻さない。リンク・ポインタは変更されていない。（ｘ０４ブロッキング・ミューテータ待機フラグがオンの場合、それはリンク・ポインタを暫定的にブロックした他のミューテータの注意のためであり、リンク・ポインタをブロック解除するとき、それを見る。）
【０３７９】
ブロッカ／ビュー・オブジェクトの対話：
リンクの挿入時期を待機するイテレータの発見：
リンクを挿入するために必要とされるリンク・ポインタをブロックした後、ミューテータは、前リンク内の順方向リンク・ポインタに接続されるイテレータが前進するのを待機する。SharedChainオブジェクト内のacitive_inspector_view_countフィールドが非ゼロの場合、インスペクタのビュー・オブジェクトが調査されなければならず、SharedChainオブジェクト内のacitive_mutator_view_countフィールドが非ゼロの場合、ミューテータのビュー・オブジェクトが調査されなければならない。ビュー・オブジェクトが調査されなければならない場合、それぞれのビュー・オブジェクトの調査は、ブロッキング・ミューテータがイテレータが前進するのを待機しなければならないか否かを示すブール値を戻す。真応答の数は、ブロッキング・ミューテータが待機しなければならない"前進の通知"の回数である。次のステップが、調査される各ビュー・オブジェクトに対して実行される。
【０３８０】
ステップ１：ビュー・オブジェクトのcurPtrフィールドが、前リンク内の順方向リンク・ポインタを指し示さない場合、ビュー・オブジェクトは興味対象ではなく、プロセスは終了し、偽を戻す。
【０３８１】
ステップ２：ビュー・オブジェクトのcurPtrフィールドが、このミューテータのブロッカ・オブジェクトを指し示す場合、イテレータは、ミューテータがそのリンク・ポインタをブロック解除するのを待機することを既にコミット済みである。この場合、ビュー・オブジェクトは興味対象ではなく、従って偽を戻す。（これは決して、インスペクタのビュー・オブジェクトを調査しているときではない。なぜなら、インスペクタはブロッキング・ミューテータを待機しないからである。）
【０３８２】
ステップ３：ビュー・オブジェクトのcurPtrフィールドが、１）ミューテータがブロックする前に、リンク・ポインタが以前によく指し示したのと同一のリンクを指し示す場合、または２）異なるブロッカ・オブジェクトを指し示す場合、ビュー・オブジェクトはミューテータにとって興味対象ではない。（インスペクタのビュー・オブジェクトを調査するとき、curLinkは決してブロッカ・オブジェクトを指しているように見られない。なぜなら、インスペクタが待機しないからである。そして、ミューテータのビュー・オブジェクトにおいて、curLinkが異なるブロッカ・オブジェクトを指し示す場合、これは単に、そのブロッカ・オブジェクトを使用しているミューテータが、最近リンク・ポインタをブロック解除したが、まだcurLinkの更新に着手していないことを示す。）いずれの場合にも、compareAndSwapQualified()機能を用いて、ビュー・オブジェクトのcurPtrフィールド内のｘ０１コミット済み待機者フラグをセットしようとする。それが失敗する場合（curLinkまたはcurPtrがその間に変更されたことによる）、ステップ１に戻り、最初からやり直す。成功の場合には、ミューテータはイテレータが前進するのを待機することをコミットしており、従って、イテレータのタスクの優先順位をバンプする。次に、compareAndSwap()機能を用いて、ビュー・オブジェクトのcurPtrフィールド内のｘ０２優先順位バンプ・フラグをセットしようとする。試行が失敗すると（イテレータが既に前進しており、curPtrを変更したことによる）、ビュー・オブジェクト内のpriority_bump_uncertainty_resolver（単一タスク・ブロッカ・オブジェクト）をブロック解除し、偽を返却する。（前進中のイテレータは、curPtrの旧値においてｘ０１コミット済み待機者フラグがオンであるが、ｘ０２優先順位バンプ・フラグがオフであることを知るので、ミューテータにその前進を通知しなくてよいことを知り、そのpriority_bump_uncertainty_resolverオブジェクトがブロック解除されるのを待機する。従って、そのタスクの優先順位をアンバンプする前に、それがバンプされたことを確認できる。）ｘ０２優先順位バンプ・フラグをセットする試行が成功すると、真を戻す。これはミューテータが待機するイテレータのビュー・オブジェクトである。（イテレータが前進し、curPtrの旧値において、ｘ０１コミット済み待機者フラグ及びｘ０２優先順位バンプ・フラグがオンであることを確認すると、ミューテータにその前進を通知し、自身のタスクの優先順位をアンバンプする。）
【０３８３】
ステップ４：全ての他のケースにおいて、curLinkが特殊な遷移値を含む場合、これはcurPtrがセットされたが、curLinkがまだ、curPtrから参照解除される値によりセットされていないことを示す。ミューテータは、curLinkに記憶される値が、リンク・ポインタをブロックした前に獲得されたのか、後に獲得されたのかを見分けることができず、従って、イテレータが前進するのを待機する必要があるか否かが分からない。この確認のために、compareAndSwapQualified()機能を用いてcurLinkを特殊な不一致値に変更しようとする。不成功の場合（curLinkまたはcurPtrのどちらかがその間に変更されたことによる）、ステップ１に戻り、最初からやり直す。成功の場合、curPtrから参照解除した値によりcurLinkをセットするイテレータの試行を失敗させ、やり直させ、curPtrを再度参照解除する。そして今度は、リンク・ポインタがブロックされるのを見て取れる。このように、ミューテータは、イテレータが前進するのを待機する必要がないことを確認でき、従って偽を戻す。それ以外では、ステップ５に継続する。
【０３８４】
ステップ５：ビュー・オブジェクトがミューテータの興味対象でないように見られるが、curLink値が現在値であることが確認されるべきである。compareAndSwap()機能を用いて、以前に抽出された値をcurLinkに記憶しようとする。不成功の場合、ステップ１に戻り、最初からやり直す。それ以外では、ビュー・オブジェクトはミューテータの興味対象ではなく、従って偽を戻す。
【０３８５】
全てのビュー・オブジェクトが調査されると、真応答の数がミューテータが前進するより前に、前進しなければならないイテレータの数を表す。この数をミューテータのブロッカ・オブジェクト内のステータス制御オブジェクトに追加する。ｘ０１コミット済み待機者及びｘ０２優先順位バンプ・フラグが、ミューテータにその前進を通知しなければならない各イテレータのcurPtr内においてオンである（そのブロッカ・オブジェクト内のステータス制御オブジェクトを減分する）。ミューテータは多くの通知の発生を待機する。
【０３８６】
リンクの削除時期を待機するイテレータの発見：
リンクを削除するために必要とされるリンク・ポインタをブロックした後、ミューテータは、前リンク内の順方向リンク・ポインタに接続されるイテレータ、または削除されるリンク内の順方向ポインタが前進するのを待機しなければならない。SharedChainオブジェクト内のacitive_inspector_view_countフィールドが非ゼロの場合、インスペクタのビュー・オブジェクトが調査されなければならず、SharedChainオブジェクト内のacitive_mutator_view_countフィールドが非ゼロの場合、ミューテータのビュー・オブジェクトが調査されなければならない。ビュー・オブジェクトが調査されなければならない場合、それぞれのビュー・オブジェクトの調査は、ブロッキング・ミューテータがイテレータが前進するのを待機しなければならないか否かを示すブール値を戻す。真応答の数は、ブロッキング・ミューテータが待機しなければならない"前進の通知"の回数である。次のステップが、調査される各ビュー・オブジェクトに対して実行される。
【０３８７】
ステップ１：ビュー・オブジェクトのcurPtrフィールドが、削除されるリンク内の順方向リンク・ポインタを指し示さない場合、ステップ２に進む。それ以外では、compareAndSwapQualified()機能を用いて、ビュー・オブジェクトのcurPtr内のｘ０１コミット済み待機者フラグをセットしようとする。失敗の場合（curLinkまたはcurPtrのどちらかがその間に変更されたことによる）、このステップの最初に戻り、やり直す。成功の場合には、ミューテータがイテレータの前進を待機するのをコミットしたことを示し、イテレータのタスクの優先順位をバンプする。次に、compareAndSwap()機能を用いて、ビュー・オブジェクトのcurPtrフィールド内のｘ０２優先順位バンプ・フラグをセットしようとする。試行が失敗すると（イテレータが既に前進しており、curPtrを変更したことによる）、ビュー・オブジェクト内のpriority_bump_uncertainty_resolver（単一タスク・ブロッカ・オブジェクト）をブロック解除し、偽を返却する。（前進中のイテレータは、curPtrの旧値においてｘ０１コミット済み待機者フラグがオンであるが、ｘ０２優先順位バンプ・フラグがオフであることを知るので、ミューテータにその前進を通知しなくてよいことを知り、そのpriority_bump_uncertainty_resolverオブジェクトがブロック解除されるのを待機する。従って、そのタスクの優先順位をアンバンプする前に、それがバンプされたことを確認できる。）ｘ０２優先順位バンプ・フラグをセットする試行が成功すると、真を戻す。これはミューテータが待機するイテレータのビュー・オブジェクトである。（イテレータが前進し、ｘ０１コミット済み待機者フラグ及びｘ０２優先順位バンプ・フラグが、curPtrの旧値においてオンであることを確認すると、ミューテータにその前進及びを通知し、自身のタスクの優先順位をアンバンプする。）ステップ１が真を戻さなかった場合、ステップ２に継続する。
【０３８８】
ステップ２：ビュー・オブジェクトのcurPtrフィールドが、前リンク内の順方向リンク・ポインタを指し示さない場合、ビュー・オブジェクトは興味対象ではなく、従って偽を戻す。それ以外では、ステップ３に継続する。
【０３８９】
ステップ３：ビュー・オブジェクトのcurPtrフィールドが、ミューテータのブロッカ・オブジェクトを指し示す場合、イテレータは既にミューテータを待機することをコミット済みである。この場合、ビュー・オブジェクトは興味対象ではなく、従って偽を戻す。それ以外では、ステップ４に継続する。
【０３９０】
ステップ４：ビュー・オブジェクトのcurPtrフィールドが、１）ミューテータがブロックする前に、リンク・ポインタが以前によく指し示したのと同一のリンクを指し示す場合、または２）異なるブロッカ・オブジェクトを指し示す場合、ビュー・オブジェクトはミューテータにとって興味対象ではない。（インスペクタのビュー・オブジェクトを調査するとき、curLinkは決してブロッカ・オブジェクトを指しているように見られない。なぜなら、インスペクタが待機しないからである。そして、ミューテータのビュー・オブジェクトにおいて、curLinkが異なるブロッカ・オブジェクトを指し示す場合、これは単に、そのブロッカ・オブジェクトを使用しているミューテータが、最近リンク・ポインタをブロック解除したが、まだcurLinkの更新に着手していないことを示す。）いずれの場合にも、compareAndSwapQualified()機能を用いて、ビュー・オブジェクトのcurPtrフィールド内のｘ０１コミット済み待機者フラグ及びｘ０４削除待機フラグをセットしようとする。それが失敗する場合（curLinkまたはcurPtrがその間に変更されたことによる）、ステップ１に戻り、最初からやり直す。成功の場合には、ミューテータはイテレータが（２度）前進するのを待機することをコミットしており、従って、イテレータのタスクの優先順位をバンプする。次に、compareAndSwap()機能を用いて、ビュー・オブジェクトのcurPtrフィールド内のｘ０２優先順位バンプ・フラグをセットしようとする。試行が失敗すると（イテレータが既に前進しており、curPtrを変更したことによる）、ビュー・オブジェクト内のpriority_bump_uncertainty_resolver（単一タスク・ブロッカ・オブジェクト）をブロック解除し、真を返却する。（前進中のイテレータは、curPtrの旧値においてｘ０１コミット済み待機者フラグ及びｘ０４削除待機フラグがオンであり、ｘ０２優先順位バンプ・フラグがオフであることを知る。このイテレータは、curPtr内のｘ０１コミット済み待機者フラグ及びｘ０２優先順位バンプ・フラグをセットすることにより、次回の前進時にミューテータに通知し、それ自身のタスクの優先順位ををアンバンプすることを知る。その間、そのpriority_bump_uncertainty_resolverがブロック解除されるのを待機し、そのタスクの優先順位を最終的にアンバンプする前に、それがバンプされたことを確認できる。）ｘ０２優先順位バンプ・フラグをセットする試行が成功すると、真を戻す。それ以外では、ステップ５に継続する。前者の場合、これはミューテータが待機するイテレータのビュー・オブジェクトである。（イテレータが前進し、curPtrの旧値内の３つの全てのフラグがオンであることを見い出すと、curPtr内のｘ０１コミット済み待機者フラグ及びｘ０２優先順位バンプ・フラグをセットし、それにより次回の前進時に、ミューテータにその前進を通知し、それ自身のタスクの優先順位ををアンバンプすることを知る。
【０３９１】
ステップ５：curLinkが特殊な遷移値を含む場合、これはcurPtrがセットされたが、curLinkがまだ、curPtrから参照解除される値によりセットされていないことを示す。ミューテータは、curLinkに記憶される値が、リンク・ポインタをブロックした前に獲得されたのか、後に獲得されたのかを見分けることができず、従って、イテレータが前進するのを待機する必要があるか否かが分からない。この確認のために、compareAndSwapQualified()機能を用いて、curLinkを特殊な不一致値に変更しようとする。不成功の場合（curLinkまたはcurPtrのどちらかがその間に変更されたことによる）、ステップ１に戻り、最初からやり直す。成功の場合、curPtrから参照解除した値によりcurLinkをセットするイテレータの試行を失敗させ、やり直させ、curPtrを再度参照解除する。そして今度は、リンク・ポインタがブロックされるのを見て取れる。このように、ミューテータは、イテレータが前進するのを待機する必要がないことを確認でき、従って偽を戻す。それ以外では、ステップ６に継続する。
【０３９２】
ステップ６：curLinkが特殊な遷移値を含まない場合、ビュー・オブジェクトはミューテータの興味対象でないように見られるが、curLink値が現在値であることが確認されるべきである。compareAndSwap()機能を用いて、以前に抽出された値をcurLinkに記憶しようとする。不成功の場合、ステップ１に戻り、最初からやり直す。それ以外では、ビュー・オブジェクトはミューテータの興味対象ではなく、従って偽を戻す。
【０３９３】
全てのビュー・オブジェクトが調査されると、真応答の数がミューテータが前進するより前に、前進しなければならないイテレータの数を表す。この数をミューテータのブロッカ・オブジェクト内のステータス制御オブジェクトに追加する。その後、その多くの通知の発生を待機する（ステータス制御オブジェクトを減分する）。
【０３９４】
リンク・ポインタのブロック解除時に起き上がる反復ミューテータの発見：
ミューテータがそのリンク・ポインタをブロック解除するとき、順方向リンク・ポインタの旧（ブロック化）値が、オン状態のｘ０２反復ミューテータ待機フラグを含む場合、これは少なくとも１つの反復ミューテータが、ミューテータがそのリンク・ポインタをブロック解除するのを待機することをコミットしている、またはコミットしたかもしれないことを意味する。その場合、ミューテータのビュー・オブジェクトの各々が調査される。各々のビュー・オブジェクトの調査は、反復ミューテータが、リンク・ポインタがブロック解除されるのを待機することをコミットしたか否かを示すブール値を戻す。真応答の数は、呼び起こされる反復ミューテータの数を表し、これらは呼び起こされると、ブロッキング・ミューテータに待機を完了したことを通知する。（全ての反復ミューテータが待機を完了したことを示すと、ブロッカ・オブジェクトは再利用可能になる。）次のステップが、調査される各ビュー・オブジェクトに対して実行される。
【０３９５】
ステップ１：ビュー・オブジェクトのcurPtrフィールドが、前リンク内の順方向リンク・ポインタを指し示さない場合、ビュー・オブジェクトはブロック解除ミューテータの興味対象ではなく、従って偽を戻す。それ以外では、ステップ２に継続する。
【０３９６】
ステップ２：ビュー・オブジェクトのcurLinkフィールドが、ブロック解除ミューテータのブロッカ・オブジェクトを指し示す場合（ｘ０１コミット済み待機者フラグがオン）、反復ミューテータはリンク・ポインタがブロック解除されるのを待機することをコミット済みである。この場合、compareAndSwap()機能を用いて、curLinkをリンク・ポインタの新たな（ブロック解除）値によりセットしようとする。試行が失敗する場合（反復ミューテータが、curLink内のｘ０２優先順位バンプまたはｘ０４優先順位非バンプ・フラグをセットしていることによる）、このステップの最初に戻り、再度試行する。一旦試行が成功すると、反復ミューテータは現リンクを有し、ブロック解除ミューテータがcurLinkの旧値から、反復ミューテータがそのタスクの優先順位をバンプしたか否か、或いは、その情報が不確実か否かを知る。ｘ０２優先順位バンプ及びｘ０４優先順位非バンプ・フラグのいずれも、curLinkの旧値においてオンでない場合、ブロック解除ミューテータは、反復ミューテータがそのタスクの優先順位をバンプしたか否かを見分けることができない。この場合、ブロック解除ミューテータのブロッカ・オブジェクト内のステータス制御オブジェクトを増分し、偽を戻す。（反復ミューテータが、ｘ０２優先順位バンプまたはｘ０４優先順位非バンプ・フラグのいずれかをセットする試行に失敗し（ブロック解除ミューテータがcurLinkを変更したことによる）、後にリンク・ポインタを再度参照解除するとき、それがブロック解除されるのを確認する。）その間に、反復ミューテータがブロッキング・ミューテータのタスクの優先順位をバンプすると、ブロック解除ミューテータのブロッカ・オブジェクト内のpriority_bump_countフィールドを増分する。次に、いずれの場合にも、ブロック解除ミューテータのステータス制御オブジェクトを減分し、優先順位バンプ不確定が解決されたことを示す。それ以外では、ｘ０２優先順位バンプ・フラグまたはｘ０４優先順位非バンプ・フラグのいずれかがオンである。ｘ０２優先順位バンプ・フラグがオンの場合、ブロック解除ミューテータのブロッカ・オブジェクト内のpriority_bump_countフィールドを増分する。いずれの場合にも、真を戻す。それ以外では、ステップ３に進む。
【０３９７】
ステップ３：curLinkが特殊な遷移値を含む場合、これは反復ミューテータがcurPtrをセットしたが、curLinkをまだcurPtrから参照解除される値によりセットしていないことを示す。ブロック解除ミューテータは、反復ミューテータを呼び起こす必要があるか否かを見分けることができない。この確認のために、compareAndSwapQualified()機能を用いて、curLinkを特殊な不一致値に変更しようとする。これが失敗の場合（curLinkまたはcurPtrのどちらかがその間に変更されたことによる）、ステップ１に戻り、最初からやり直す。成功の場合、反復ミューテータがcurLinkをセットする試みを強制的に失敗させ、再度curPtrを参照解除するとき、リンク・ポインタがブロック解除されるのを見て取る。このように、ブロック解除ミューテータは、反復イテレータがそれを待機しないことを確認でき、従って偽を戻す。
【０３９８】
ステップ４：curLinkが特殊な遷移値を含まない場合、ビュー・オブジェクトはミューテータの興味対象でないように見られるが、このプロシージャは、curLink値が現在値であることを確認すべきである。compareAndSwap()機能を用いて、以前に抽出された値をcurLinkに記憶しようとする。不成功の場合、ステップ１に戻り、最初からやり直す。それ以外では、ビュー・オブジェクトはミューテータの興味対象ではなく、従って偽を戻す。
【０３９９】
ミューテータの全てのビュー・オブジェクトが調査されると、ブロック解除ミューテータは次のカウントを有する。すなわち、ａ）自分が呼び起こさなければならず、また起き上がったこと、及びもはや待機していないことを自分に通知しなければならない待機者の数、ｂ）ブロッキング・ミューテータが解決の通知を待たなければならない、（ステータス制御オブジェクト内の）残りの優先順位バンプ不確定の数、及びｃ）ブロッキング・ミューテータがその待機者から受信した優先順位バンプの数（priority_bump_countフィールド）である。
【０４００】
リンク・ポインタのブロック解除時に起き上がるブロッキング・ミューテータの発見：
ミューテータがそのリンク・ポインタをブロック解除するとき、いずれかのリンク・ポインタの旧（ブロック化）値が、オン状態のｘ０４ブロッキング・ミューテータ待機フラグを含む場合、これは少なくとも１つのブロッキング・ミューテータが、ブロック解除ミューテータがそのリンク・ポインタをブロック解除するの待機することをコミットしている、またはコミットしたかもしれないことを意味する。その場合、各ブロッカ・オブジェクトが調査される。各々のブロッカ・オブジェクトの調査は、ブロッキング・ミューテータが、リンク・ポインタがブロック解除されるのを待機することをコミットしたか否かを示すブール値を戻す。真応答の数は、呼び起こされるブロッキング・ミューテータの数を表し、これらは呼び起こされると、ブロック解除ミューテータに待機を完了したことを通知する。（全てのブロッキング・ミューテータが待機を完了したことを示すと、ブロッカ・オブジェクトは再利用可能になる。）次のステップが、各ブロッカ・オブジェクトの調査において実行される。
【０４０１】
ステップ１：ブロッカ・オブジェクト内のブロッカ待機フィールドが、ブロック解除ミューテータのブロッカ・オブジェクトを指し示さない場合（全てのフラグ・ビットを無視する）、ブロッカ・オブジェクトは興味対象ではなく、従って偽を戻す。それ以外では、ステップ２に継続する。
【０４０２】
ステップ２：compareAndSwap()機能を用いて、ブロッカ・オブジェクトのブロッカ待機フィールドをNULLにセットしようとする。試行が失敗する場合（ブロッキング・ミューテータがそれ内のフラグをセットしていることによる）、このステップの最初に戻り、再度試行する。最終的に成功するとき、ブロッカ待機フィールドがNULLであり、ブロッキング・ミューテータがもはや待機中でないことを示す。
【０４０３】
ステップ３：ブロッカ待機フィールドの旧値において、ｘ０１コミット済み待機者フラグがオフの場合、これはブロック解除ミューテータがリンク・ポインタをブロック解除したとき、ブロッキング・ミューテータが待機をコミットするまで進んでいないことを意味する。この場合、偽を戻し、それ以外では、ステップ４に継続する。
【０４０４】
ブロッキング・ミューテータは、ブロック解除ミューテータがそのリンク・ポインタをブロック解除するのを待機することをコミット済みである。ブロッキング・ミューテータは、ブロック解除ミューテータのタスクの優先順位のバンプを試行するが、それを達成し、結果を示せるまで進んだかもしれないし、そうでないかもしれない。curLinkの旧値において、ｘ０２優先順位バンプ・フラグもｘ０４優先順位非バンプ・フラグもオンでない場合、優先順位バンプは不確定である。その場合、ブロック解除ミューテータのブロッカ・オブジェクト内のステータス制御オブジェクトを増分し、偽を戻す。それ以外では、ステップ５に継続する。（ブロッキング・ミューテータは、ｘ０２優先順位バンプ・フラグまたはｘ０４優先順位非バンプ・フラグのいずれかをセットする試行に失敗し（ブロック解除ミューテータがブロッカ待機フィールドをNULLにセットしたことによる）、後にリンク・ポインタを再度参照解除するとき、それがブロック解除されているのを確認する。）その間に、ブロッキング・ミューテータがブロック解除ミューテータのタスクの優先順位をバンプすると、ブロック解除ミューテータのブロッカ・オブジェクト内のpriority_bump_countフィールドを増分する。次に、いずれの場合にも、ブロック解除ミューテータのステータス制御オブジェクトを減分し、優先順位バンプ不確定が解決されたことを示す。
【０４０５】
ステップ５：ｘ０２優先順位バンプ・フラグまたはｘ０４優先順位非バンプ・フラグのいずれかがオンである。ｘ０２優先順位バンプ・フラグがオンの場合、ブロック解除ミューテータのブロッカ・オブジェクト内のpriority_bump_countフィールドを増分する。いずれの場合にも、真を戻す。
【０４０６】
全てのブロッカ・オブジェクトが調査されると、ブロック解除ミューテータは次のカウントを有する。すなわち、ａ）自分が呼び起こさなければならず、また起き上がったこと、及びもはや待機していないことを自分に通知しなければならない待機者の数、ｂ）ブロッキング・ミューテータが解決の通知を待たなければならない、（ステータス制御オブジェクト内の）優先順位バンプ不確定の数、及びｃ）ブロッキング・ミューテータがその待機者から受信した優先順位バンプの数（priority_bump_countフィールド）である。
【０４０７】
待機及びウェイク・アップ：
ミューテータがそのリンク・ポインタをブロック解除することの待機：
このプロシージャは、第２のミューテータがそのリンク・ポインタをブロック解除するのを待機しなければならない、反復ミューテータまたはブロッキング・ミューテータから呼び出される。反復ミューテータのビュー・オブジェクト内のcurLinkフィールドの参照、またはブロッキング・ミューテータのブロッカ・オブジェクト内のブロッカ待機フィールドの参照がパラメータとして渡される。これは、それが第２のミューテータのタスクの優先順位をバンプする試行の結果により更新されるように行われる。（ｘ０１コミット済み待機者フラグが既にオンにセットされている。）この機能は、リンク・ポインタがブロック解除されるのを待機した後、または優先順位バンプ指示をセットする間に、リンク・ポインタがブロック解除されたことが見い出されたために、待機が必要と判断した後にだけ、復帰する。
【０４０８】
ステップ１：第２のミューテータのタスクの優先順位をバンプし、ｘ０２優先順位バンプ・フラグをフラグ・ビットとして、ステップ２で使用する。しかしながら、第２のミューテータのタスクの優先順位をバンプすることが必要でない場合、ｘ０４優先順位非バンプ・フラグがフラグ・ビットとしてステップ２で使用される。
【０４０９】
ステップ２：compareAndSwap()機能を用いて、ステップ１で決定されたフラグ・ビットをセットしようとする。成功すると、ステップ３に進む。それ以外では、試行は失敗する。なぜなら、第２のミューテータが既にリンク・ポインタをブロック解除し、興味対象のフィールドを更新したからである。すなわち、フィールドがビュー・オブジェクト内のcurLinkの場合、そのイテレータの新たな現リンクを指し示す。フィールドがブロッカ・オブジェクト内のブロッカ待機フィールドの場合には、NULLである。いずれの場合にも、待機中のポイントは存在しない。なぜなら、リンク・ポインタは現在ブロック解除されたが、第２のミューテータが、フィールドの旧値内のｘ０２優先順位バンプ・フラグもｘ０４優先順位非バンプ・フラグも見ておらず、そのタスクの優先順位がバンプされたか否かを知らないからである。従って、優先順位がステップ１でバンプされた場合、第２のミューテータのブロッカ・オブジェクト内の優先順位バンプ・フラグを増分する。次に、いずれの場合にも、第２のミューテータのブロッカ・オブジェクト内のステータス制御オブジェクトを減分し、優先順位バンプ不確定が解決されたことを通知し、処理を終了する。（第２のミューテータは結局、全ての優先順位バンプ不確定が解決されたことを待機する。）
【０４１０】
ステップ３：この時点で、第２のミューテータのタスクの優先順位がバンプされたか否かを示すフラグがセットされ、第２のミューテータがそのリンク・ポインタをブロック解除するのを待機する。（ミューテータがそのリンク・ポインタをブロック解除し、待機中のミューテータのブロッカまたはビュー・オブジェクトを調べるとき、そのタスクの優先順位がバンプされたか否かを知る。）待機から起こされると、第２のミューテータのブロッカ・オブジェクト内のステータス制御オブジェクトを減分して、待機が完了したことを通知し、処理を終了する。（これは現ミューテータがもはや第２のミューテータのブロッカ・オブジェクトを参照せず、全てのこうした参照が消滅するとき、そのブロッカ・オブジェクトが別のミューテート機能のために使用されることを示す。）
【０４１１】
１次待機及びウェイクアップ機構：
ステータス制御状態カウンタ・オブジェクトは、イテレータ及びミューテータが互いに待機し、起こし合う時に関係する基本オブジェクトである。このオブジェクトはブロッカ・オブジェクト内に存在し、次の事象を制御する。すなわち、ａ）ブロッカ・オブジェクトがアクティブか非アクティブかを決定する事象、及びこれらの状態間を遷移するアトミック手段、ｂ）ブロッカ・オブジェクトを使用中のミューテータに、イテレータが前進するのを待機させる事象、ｃ）反復ミューテータ及びブロッキング・ミューテータに、ブロッカ・オブジェクトを使用中のミューテータがそのリンク・ポインタをブロック解除するのを待機させる事象、及びｄ）ブロッカ・オブジェクトを使用中のミューテータに、全ての優先順位バンプ不確定が解決されるのを待機させる事象である。
【表１５】
状態カウンタ値：
[値]  ０
[意味]  この値はブロッカ・オブジェクトが非アクティブ状態であることを示す。ブロッカ・オブジェクトをアクティブ状態に変更するためには（それをミューテータに割当てるとき）、カウンタがアトミックにゼロから非ゼロ値に変更される。（これを行う前に、SharedChainオブジェクト内のactivated_blocker_and_view_countフィールドが、アトミックに１増分される。）
[値]  ｘ８０００
[意味]  すなわち、最上位ビットが１であり、他の全てが０である。これはカウンタの状態を非アクティブからアクティブに変更するためにカウンタに割当てられる値である。カウンタがこの値を有する間、ブロッカ・オブジェクトを使用するミューテータは定常状態であり、反復またはブロッキング・ミューテータからの如何なる種類の通知も待機していない。ブロッキング・ミューテータがあらゆるリンク・ポインタをブロックした場合、全ての待機中のミューテータが、カウンタがｘ４０００未満の値になるのを待機しており、従って、この値はそれらを待機させる。
[値]  ｘ８０００ +/- ｘ
[意味]  この範囲の値は、ブロッキング・ミューテータがイテレータが前進するのを待機していることを示す。値ｘは関連するイテレータの数であり、定義された範囲を有する。ブロッキング・ミューテータがビュー・オブジェクトを見るとき、curPtr内の適切なフラグをセットし、自分が待機しなければならないイテレータの数をカウントする。イテレータが前進するとき、それらは状態カウンタを１減分することにより、ブロッキング・ミューテータにそれらの前進について通知する。全てのビュー・オブジェクトを見た後、ブロッキング・ミューテータは自分が待機しなければならないイテレータの数を、その状態カウンタにアトミックに加算する。次に、状態カウンタが定常状態値ｘ８０００に減分するのを待機し、残りのイテレータはそれらの前進を通知する。全ての通知が発生すると、ブロッキング・ミューテータは自由にそのリンク・ポインタをブロック解除でき、邪魔になる他のイテレータが存在しないことを知る。この間の全てを通じて、カウンタ内の値は、リンク・ポインタがブロック解除されるのを待機する必要のある全てのミューテータを待機させるために十分に大きい。
[値]  ｘ８０００ +/- ｙ
[意味]  この範囲の値は、ブロッキング・ミューテータが優先順位バンプ不確定が解決されるのを待機していることを示す。値ｙは残りの不確定の数であり、前記のｘと同じ範囲を有する。カウンタを見ることにより、この状態をブロッキング・ミューテータがイテレータの前進を待機している前記の状態と区別することは不可能である。しかしながら、この場合、ブロッキング・ミューテータはそのリンク・ポインタをブロック解除しており、コミット済み待機者の数をカウントしている間、優先順位バンプ不確定の数もカウントする。待機者が不確定に遭遇し、それを解決するとき、それらはこのカウンタを減分する。その間、ブロッキング・ミューテータが不確定の総数をこのカウンタに加算し、それが定常状態値ｘ８０００に戻るのを待機する。この値に達すると、ブロッキング・ミューテータは、その優先順位が待機者により何度バンプされたかを知ることができ、それ自身の優先順位を何度もアンバンプできる。
[値]  ｚ
[意味]  一旦ブロッキング・ミューテータがそのリンク・ポインタをブロック解除し、全ての優先順位バンプ不確定が解決されるのを待機すると、カウンタを前にカウントしたコミット済み待機者の数にセットする。これは全ての待機者を呼び起こす（この時点に達すると、待機をコミットしたが、まだ待機を開始していないものが、即時待機を取りやめる）。各待機者は呼び起こされるとき、このカウンタを１減分することにより、ブロッキング・ミューテータに待機を完了したことを通知する。従って、値ｚは、待機を完了したことをミューテータにまだ通知していない未解決の待機者の数を表す。カウンタが０に達すると、ブロッカは非アクティブ状態に戻り、（もはや未解決の参照が存在しないので）別のミューテータにより再利用可能となり、SharedChainオブジェクト内のactivated_blocker_and_view_countフィールドのブロッカ部分が１減分される。フィールド全体が０の場合、再利用機能が自由に過度なブロッカ・オブジェクトまたはビュー・オブジェクトを除去することができる。
【０４１２】
リンク転送機構：
リンク転送機構は、１ブロッキング・ミューテータがリンク・ポインタの使用を、別のブロッキング・ミューテータに私的に転送するための手段である。この機構は、ブロッカ・オブジェクト内において、異なる状態カウンタ・オブジェクトを使用する２つの異なる状況において使用される。
【０４１３】
第１の状況：ミューテータ１（ブロッカ・オブジェクト１を使用）が、リンク内の逆方向ポインタを暫定的にブロックしており、前リンク内の順方向ポインタがミューテータ２（ブロッカ・オブジェクト２を使用）によりブロックされることを発見する場合、ミューテータ１はその暫定ブロックを延期し、ミューテータ２がそのリンク・ポインタを使用することを許可する。ミューテータ１はリンク転送機構を用いて、前リンクを指し示すポインタを、ブロッカ・オブジェクト２内の延期リンク制御状態カウンタ・オブジェクト内に配置する。その間に、ミューテータ２はこの延期リンク制御オブジェクトを待機し、ミューテータ１がリンク・ポインタをそこに配置するとき、呼び起こされる。リンク・ポインタをミューテータ２に転送後、ミューテータ１はそれ自身のブロッカ・オブジェクト内の延期リンク制御オブジェクトを待機する。ミューテータ２は終了すると、リンク・ポインタをミューテータ１に返送し、新たな前リンクを指し示すポインタを、ブロッカ・オブジェクト１内の延期リンク制御オブジェクト内に配置し、ミューテータ１を呼び起こす。
【０４１４】
第２の状況：ミューテータ１（ブロッカ・オブジェクト１を使用）がリンクを削除しようとするとき、そのリンク内の順方向ポインタがミューテータ２（ブロッカ・オブジェクト２を使用）により既にブロックされることを発見する場合、ミューテータ１は、そのブロッカ・オブジェクト内のブロック化削除制御状態カウンタ・オブジェクトを待機する。ミューテータ２がそのリンク・ポインタをブロック解除するところまで進み、そのリンク・ポインタが、それを含むリンクを削除しようとするミューテータにより待機されていることを発見すると、そのリンク・ポインタをブロック解除する代わりに、ミューテータ２はミューテータ１のために、それを再ブロックする。すると、ミューテータ２はリンク転送機構を使用して、次のリンクを指し示すポインタをミューテータ１に渡す。これはそのポインタを、ブロッカ・オブジェクト１内のブロック化削除制御状態カウンタ・オブジェクトに記憶することにより、達成される。これによりミューテータ１が呼び起こされ、ミューテータ１は次のリンクを指し示すポインタをそのブロック化削除制御オブジェクトから検索し、処理を継続する。この時点で、ミューテータ１は、自分が削除しようとしているリンク内の順方向リンク・ポインタを成功裡にブロックしたことになる。
【０４１５】
リンク転送機構は、使用されている状況に関係なく、同様に機能する。状態カウンタ・オブジェクトは、リンクを指し示すポインタか、状態カウンタが属するミューテータのステータスを反映する値のいずれかを含む。表１６は、カウンタ内に現れるステータス値を表す。これらはリンク・ポインタ内に現れるビット・フラグと矛盾しないように、またリンク・ポインタと混同しないように選択されている（リンク・ポインタとしてのオール・ゼロは、チェーン内の最初か最後のリンクのいずれかを参照する）。
【表１６】
ステータス値：
[値]  ｘ００..０８
[意味]  非アクティブ
[説明]  これはカウンタの初期値である。これはミューテータがリンク・ポインタを受信するための待機プロセスを開始していないことを示す。
[値]  ｘ００..０１
[意味]  コミット済み待機者
[説明]  これはミューテータが待機プロセスを開始するときに記憶する値である。これは被待機ミューテータのタスクの優先順位がバンプされたか否かに関する不確かさを示す。
[値]  ｘ００..０３
[意味]  優先順位バンプ
[説明]  この値は、ミューテータがリンク・ポインタの受信を待機しており、リンク・ポインタを受信するミューテータのタスクの優先順位をバンプしたことを示す。
[値]  ｘ００..０５
[意味]  優先順位非バンプ
[説明]  この値は、ミューテータがリンク・ポインタの受信を待機しており、リンク・ポインタを受信するミューテータのタスクの優先順位をバンプする必要がないと判断したことを示す。
【０４１６】
リンク・ポインタを転送しているミューテータが、リンク・ポインタを受信するミューテータが受信準備を行うより前に、若しくは最中に、または後に転送するかは、前もって知ることはできない。
【０４１７】
別のミューテータへのリンク・ポインタの転送：
ミューテータがリンク・ポインタを別のミューテータに転送したい場合、その第２のミューテータのブロッカ・オブジェクトを知り、そのブロッカ・オブジェクト内の適切な状態カウンタに作用する。次のステップにより、リンク・ポインタを転送する。
【０４１８】
ステップ１：状態カウンタ・オブジェクトから現カウンタ値を獲得する。
【０４１９】
ステップ２：compareAndSwapCounter()機能を用いて、カウンタをその現在値からリンク・ポインタ値に変更しようとする。試行が失敗の場合（受信側ミューテータがカウンタ内のフラグをセットしていることによる）、ステップ１に戻り、やり直す。それ以外では、ステップ３に継続する。
【０４２０】
ステップ３：カウンタ値の旧値がｘ０８非アクティブ値であった場合、これは第２のミューテータが待機をまだ開始しておらず、実際には待機しない上、第１のミューテータのタスクの優先順位もバンプしないことを示す。この場合、転送機構は完了する。それ以外では、ステップ４に継続する。
【０４２１】
ステップ４：カウンタの旧値がｘ０１コミット済み待機者の場合、第２のミューテータは待機プロセスを開始しており、実際に待機する前に、第１のミューテータのタスクの優先順位をバンプしようとする。しかしながら、第１のミューテータは、そのタスクの優先順位がバンプされたか否かを知ることはできない。第１のミューテータのブロッカ・オブジェクト内のステータスを増分して、最終的に解決されなければならない優先順位バンプ不確定を示し、転送機能が完了する。（第１のミューテータは最終的に、全ての優先順位バンプ不確定が解決されるのを待機し、第２のミューテータは第１のミューテータのステータス制御オブジェクトを減分し、解決を示す。第２のミューテータは実際には、リンク転送を待機しない。）カウンタの旧値がｘ０１コミット済み待機者でなかった場合、ステップ５に継続する。
【０４２２】
ステップ５：カウンタの旧値がｘ０３優先順位バンプであった場合、第２のミューテータが第１のミューテータのタスクの優先順位をバンプしたことになる。この場合、第１のミューテータのブロッカ・オブジェクト内のpriority_bump_countフィールドを増分し、転送機能が完了する。（第１のミューテータは最終的に、それ自身のタスクの優先順位をアンバンプする。その間に、第２のミューテータはその待機から呼び起こされる。）
【０４２３】
ステップ６：その他の場合、カウンタの旧値はｘ０５優先順位非バンプであり、これは第２のミューテータが、第１のミューテータのタスクの優先順位をバンプする必要がないと判断したことを示す。この場合、転送機能が完了する。（第２のミューテータがその待機から呼び起こされる。）
【０４２４】
転送されるリンク・ポインタの受信の待機：
ミューテータは第２のミューテータからリンク・ポインタを受信したい場合、第２のミューテータがリンク・ポインタを、第１のミューテータのブロッカ・オブジェクト内の特定の状態カウンタ・オブジェクトに渡すことを知っている。次のステップは、リンク・ポインタを受信するための待機プロセスを示す。
【０４２５】
ステップ１：compareAndSwapCount（）機能を状態カウンタ・オブジェクトに対して使用し、カウンタをその期待ｘ０８非アクティブ値から、ｘ０１コミット済み待機者値に変更しようとする。試行が失敗する場合、それは第２のミューテータが既にリンク・ポインタを転送したことによる。その場合、ステップ６に進む。それ以外では、ステップ２に継続する。
【０４２６】
ステップ２：試行が成功する。カウンタの新たな値は、第２のミューテータがリンク・ポインタを今すぐ転送する場合、そのタスクの優先順位がバンプされたか否かを知ることができないことを示す。tryBump()を呼び出し、第２のミューテータのタスクの優先順位をバンプしようとし、以下のステップにおいて、ｘ０３優先順位バンプ値を使用する。しかしながら、優先順位をバンプする必要がない場合、ｘ０５優先順位非バンプ値を代わりに使用する。
【０４２７】
ステップ３：compareAndSwapCount()機能を用いて、カウンタをその期待ｘ０１コミット済み待機者値から、ステップ２で決定された値に変更しようとする。試行が失敗する場合、それは第２のミューテータが丁度今、リンク・ポインタを転送したことによる。その場合、ステップ５に進む。それ以外では、ステップ４に継続する。
【０４２８】
ステップ４：カウンタが、第２のミューテータの優先順位がバンプされたか否かの指示を含み、第２のミューテータがリンク・ポインタを転送するのを待機する。これは結局、それに対する状態カウンタが、ステップ３でセットされたのとは異なる値になるのを待機することになる。第２のミューテータがリンク・ポインタを転送するとき、第１のミューテータを呼び起こす。呼び起こされると、ステップ６に継続する。
【０４２９】
ステップ５：この時点で、第２のミューテータはリンク・ポインタを転送済みであるが、その優先順位がバンプされたか否かを知らない。優先順位がステップ２でバンプされた場合、第２のミューテータのブロッカ・オブジェクト内のpriority_bump_countフィールドを増分する。いずれの場合にも、第２のミューテータのブロッカ・オブジェクト内のステータス制御オブジェクトを減分し、優先順位バンプ不確定が解決されたことを通知する。
【０４３０】
ステップ６：この時点で、第２のミューテータはリンク・ポインタを転送済みである。リンク・ポインタを状態カウンタから検索する。
【０４３１】
ステップ７：状態カウンタをｘ０８非アクティブ状態に再度セットする。これは安全に行われる。なぜなら、第１のミューテータが別のミューテータにリンク・ポインタの転送を催促するための、更に別のアクションを行うまで、他のミューテータはこの状態カウンタ・オブジェクトを用いて、リンク・ポインタを第１のミューテータに転送しようとしないからである。
【０４３２】
過度なブロッカまたはビュー・オブジェクトの再利用：
リンク・ポインタ内のｘ０２反復ミューテータ待機フラグ及びｘ０４ブロッキング・ミューテータ待機フラグと、SharedChainオブジェクト内のactive_inspector_view_countフィールド及びactive_mutator_view_countフィールドは、ミューテータがビュー・オブジェクト及びブロッカ・オブジェクトのリストを探索することが必要なときを示すことを目的とする。探索が必要のない時にそうすることは、望ましくない性能のオーバヘッドとなる。更に、ビュー・オブジェクト及びブロッカ・オブジェクトのリストを合理的に短く維持することが望ましく、そうすることで探索が必要なとき、過剰な数の非アクティブ・オブジェクトを探索しないで済む。好適には、SharedChainは最小数（現在４つ）のオブジェクトを各リスト内に保持し、過剰なオブジェクトを再利用する機会を有するとき、その時存在する過剰なオブジェクトの１／２を再利用する。この趣旨は余分なオブジェクトを除去することであるが、あまり迅速ではない。
【０４３３】
ブロッカ・オブジェクト及びビュー・オブジェクトは、単独リンク・リスト上に保持され、従って、新たなオブジェクトはロックが要求されることなく、リストの先頭にアトミックに追加される。オブジェクトに対する未解決の参照が存在しない場合、オブジェクトは削除され得る。SharedChainオブジェクト内のactivated_blocker_and_view_countフィールドが０に減分されるとき、未解決の参照が存在しないことが知れる。
【０４３４】
非アトミック・イテレータがその（非アトミック）ビュー・オブジェクトを処理済みのとき、またはブロッカ・オブジェクトのステータス制御状態カウンタが０にセットされるとき、それを参照する待機者が存在せず、activated_blocker_and_view_countフィールドの適切な部分がアトミックに１減分される。しかしながら、減分の結果、フィールド全体が０となる場合、単に減分する代わりに、１つ以上の余分なオブジェクトが存在する場合、同時にreclaim_in_progressフラグ（フィールドの上位ビット）をセットする。activated_blocker_and_view_countフィールドを減分するとき、次のステップを使用し、reclaim_in_progressフラグをセットしようとする。また必要に応じて、再利用機能を実行する。
【０４３５】
ステップ１：activated_blocker_and_view_countフィールドを一時コピーに抽出し、そこで減分を実行する。結果が０の場合、ステップ２に進む。それ以外では、compareAndSwap()を用いて、減分コピーをフィールドに戻して記憶するように試行する。試行が失敗する場合、フィールドがその間に変更されたことを示し、ステップ１の最初に戻り、やり直す。試行が成功の場合、減分が完了したが、ビュー・オブジェクト及びブロッカ・オブジェクトに対する未解決の参照が存在するので（または再使用が既に進行中）、この時点で再利用するものは存在せず、単に処理を終了する。
【０４３６】
ステップ２：この時点で、ビュー・オブジェクト及びブロッカ・オブジェクトに対する未解決の参照は存在せず、余分なオブジェクトが存在する場合、再利用が行われる。primary_view_existence_countフィールドまたはsecondary_view_existence_countフィールド（いずれか有効な方）を、sharedChainオブジェクトから、一時コピーに抽出する。このフィールドは別々に、インスペクタ及びミューテータの現存のビュー・オブジェクトの数を含む。
【０４３７】
ステップ３：blocker_and_view_existence_countフィールドを、sharedChainオブジェクトから一時コピーに抽出する。
【０４３８】
ステップ４：ステップ２及びステップ３で獲得されたフィールドを用いてインスペクタの過剰なブロッカ・オブジェクト、ビュー・オブジェクト、またはミューテータの過剰なビュー・オブジェクトが存在するか否かを判断する。過剰なオブジェクトが存在する場合、ステップ１で獲得されたactivated_blocker_and_view_countフィールドの一時コピー内のreclaim_in_progressフラグをセットする。
【０４３９】
ステップ５：compareAndSwapQualified()機能を用いて、一時コピーをactivated_blocker_and_view_countフィールドに戻す試みを行う。これが失敗する場合（その間に、activated_blocker_and_view_countフィールドまたはblocker_and_view_existence_countフィールドが変更されたことによる）、ステップ１に戻り、やり直す。試行が成功の場合、ステップ４の結果に依存して、再利用が進行中であったり、そうでなかったりする。進行中でない場合、何も実行することはなく、単に処理を終了する。
【０４４０】
ステップ６：この時点で、再利用が進行中であり、幾つかのフィールドの内容が将来の利用のために、sharedChainオブジェクトから抽出されている。一方、再利用処理が試行されている間に、フィールドそのものが変更されているかもしれない。過剰なブロッカ・オブジェクトが存在しない場合、ステップ１０に進む。
【０４４１】
ステップ７：ステップ３で実行されたカウントにもとづき、過剰なブロッカ・オブジェクトが存在する。抽出されたblocker_and_view_existence_countフィールドのブロッカ部分を過剰分の半分だけ減分する。この変更は、ステップ１６でcompareAndSwapQualified()操作が成功するまで、有効とならない。
【０４４２】
ステップ８：（primary_blocker_list_heaフィールドdまたはsecondary_blocker_list_headフィールドの有効な方からの）最初のブロッカ・オブジェクトから開始し、次のブロッカ・オブジェクトを見い出し、再利用されるブロッカ・オブジェクトの数がステップ・オーバされるまで、リストをステップ・スルーする。ステップ・オーバされるブロッカ・オブジェクトは、廃棄されるように期待されるものであり、現ブロッカ・オブジェクトは、リスト内の新たな最初のブロッカ・オブジェクトであると期待されるものである。現在、期待されたよりもより多くのブロッカ・オブジェクトがリスト内に存在するかもしれないが、より少ないことは決してない。新たな最初のブロッカ・オブジェクトを指し示すポインタを、primary_blocker_list_headフィールドまたはsecondary_blocker_list_headフィールドの、どちらか無効な方に記憶する。この変更は、ステップ１６でcompareAndSwapQualified()操作が成功するまで、何も意味を持たない。
【０４４３】
ステップ９：抽出されたblocker_and_view_existence_countフィールドのブロッカ部分内の上位ビットをトグルする。これはprimary_blocker_list_headフィールドと、secondary_blocker_list_headフィールドとを、どちらか有効な方に関してスワップする。これはステップ１６でcompareAndSwapQualified()操作が成功するまで、何も意味を持たない。しかしながら、成功すると、削除されるブロッカ・オブジェクトは、もはやリスト内で見ることができず、随意に廃棄される。
【０４４４】
ステップ１０：インスペクタに関して、過剰なビュー・オブジェクトが存在しない場合、ステップ１４に進む。
【０４４５】
ステップ１１：ステップ２で抽出されたカウントにもとづき、インスペクタに関して過剰なビュー・オブジェクトが存在する。抽出されたprimary_view_existence_countフィールドまたはsecondary_view_existence_countフィールドのインスペクタ部分を、過剰分の半分だけ減分する。更に、抽出されたblocker_and_view_existence_countフィールドのビュー部分を、同数だけ減分する。これらの変更は、ステップ１６でcompareAndSwapQualified()操作が成功するまで、有効とならない。
【０４４６】
ステップ１２：ブロッカ・オブジェクトについて述べたのと同様に、再利用されるビュー・オブジェクトの数をステップ・オーバし、リスト内で新たな最初のビュー・オブジェクトとなると期待されるビュー・オブジェクトを見い出す。再度、現在、期待されたよりもより多くのインスペクタ・ビュー・オブジェクトがリスト内に存在するかもしれないが、より少ないことは決してない。新たな最初のインスペクタ・ビュー・オブジェクトを指し示すポインタを、primary_inspector_view_chain_headフィールドまたはsecondary_inspector_view_chain_headフィールドの、どちらか無効な方に記憶する。この変更は、ステップ１６でcompareAndSwapQualified()操作が成功するまで、何も意味を持たない。
【０４４７】
ステップ１３：抽出されたprimary_view_existence_countフィールドまたはsecondary_view_existence_countフィールドのインスペクタ部分内の上位ビットをトグルする。これはprimary_inspector_view_list_headフィールドと、secondary_inspector_view_list_headフィールドとを、どちらか有効な方に関してスワップする。これはステップ１６でcompareAndSwapQualified()操作が成功するまで、何も意味を持たない。しかしながら、成功すると、削除されるビュー・オブジェクトは、もはやリスト内で見ることができず、随意に廃棄される。
【０４４８】
ステップ１４：ミューテータに関して、過剰なビュー・オブジェクトが存在しない場合、ステップ１５に進む。それ以外では、ミューテータ・ビュー・オブジェクトについて、ステップ１１乃至ステップ１３でインスペクタ・ビュー・オブジェクトに対して実行したのと等価な処理を実行する。
【０４４９】
ステップ１５：インスペクタまたはミューテータのいずれかに関連して、過剰なビュー・オブジェクトが存在した場合、抽出または更新されたprimary_view_existence_countフィールドまたはsecondary_view_existence_countフィールドを、SharedChainオブジェクト内のprimary_view_existence_countフィールドまたはsecondary_view_existence_countフィールドの、どちらか無効な方にコピーする。この更新されたフィールドは、新たなインスペクタ・ビュー・カウント、及びprimary_inspector_list_headまたはsecondary_inspector_list_headのいずれが有効かを示す指示、更に新たなミューテータ・ビュー・カウント、及びprimary_mutator_list_headフィールドまたはsecondary_mutator_list_headフィールドのいずれが有効かを示す指示を含む。これらのどれも、ステップ１６でcompareAndSwapQualified()操作が成功するまで、何も意味を持たない。更に、インスペクタまたはミューテータのいずれかに関連して、過剰なビュー・オブジェクトが存在した場合、抽出されたblocker_and_view_existence_countフィールドのビュー部分内の上位ビットをトグルする。これはprimary_view_existence_countフィールドとsecondary_view_existence_countフィールドとを、どちらか有効な方に関してスワップする。これはステップ１６でcompareAndSwapQualified()操作が成功するまで、何も意味を持たない。
【０４５０】
ステップ１６：このステップは、再利用操作全体のアトミック部分である。compareAndSwapQualified()機能を用いて、blocker_and_view_existence_countフィールドを、抽出された値に対して行われる更新によりアトミックに置換しようとする。一方、その間に、そのフィールド及びactivated_blocker_and_view_countフィールドのいずれも変化しないように保証する。操作が成功すると、ステップ２０に進む。それ以外では、変更をコミットしようとする試行が失敗する。なぜなら、操作に際してアクティブなブロッカ・オブジェクトまたはビュー・オブジェクトが存在したか、或いは、再利用処理が開始したときよりも、現在より多くのブロッカまたはビュー・オブジェクトが存在するからである。
【０４５１】
ステップ１７：ステップ２で行ったように、SharedChainオブジェクトから、primary_view_existence_countフィールドまたはsecondary_view_existence_countフィールドの、どちらか有効な方を抽出する。次に、ステップ３のように、blocker_and_view_existence_countフィールドを抽出する。
【０４５２】
ステップ１８：SharedChainオブジェクトから、activated_blocker_and_view_countフィールドを抽出する。reclaim_in_progressフラグを除き、オール・ゼロでない場合、ステップ１９に進む。それ以外では、reclaim_in_progressフラグを除きオール・ゼロなので、再利用処理が再試行される。compareAndSwapQualified()機能を用いて、activated_blocker_and_view_countフィールドを記憶し戻し、それとblocker_and_view_existence_countフィールドの両方がまだ有効であることを確認する。操作が失敗の場合、ステップ１７に移行し、再度試行する。成功の場合には、ステップ６に移行し、再利用処理を再試行する。
【０４５３】
ステップ１９：アクティブなブロッカ・オブジェクトまたはビュー・オブジェクトが存在するので、再利用機能はそれらが全て非アクティブになるまで、待機しなければならない。それで、compareAndSwapQualified()機能を用いて、reclaim_in_progressフラグをオフしようとする。操作が失敗の場合（その間に、activated_blocker_and_view_countフィールドまたはblocker_and_view_existence_countフィールドが変更されたことによる）、ステップ１７に戻り、再度試行する。試行が成功の場合、activated_blocker_and_view_existence_countフィールドが最終的に０に戻るとき、再利用操作が再試行される。
【０４５４】
ステップ２０：この時点で、再利用が成功する。ブロッカ・オブジェクトが再利用された場合、blocker_and_view_existence_countフィールドのブロッカ部分内のトグルされた上位ビットが、primary_blocker_list_headフィールドとsecondary_blocker_list_headフィールドとの役割に関して、有効及び無効を入れ替える。そして、新たな有効なリスト・ヘッドが、削除されたブロッカ・オブジェクトをバイパスする。同様に、ビュー・オブジェクトが再利用された場合、blocker_and_view_existence_countフィールドのビュー部分内のトグルされた上位ビットが、primary_view_existence_countフィールドとsecondary_view_existence_countフィールドとの役割に関して、有効及び無効を入れ替える。更に、新たな有効フィールドのどちらかの部分内のトグルされた上位ビットが、現在有効なのが、インスペクタまたはミューテータ・ビューのprimary_chain_headなのか、それともsecondary_chain_headフィールドなのかを独立に示す。インスペクタまたはミューテータ・ビュー・オブジェクトの新たに有効なリスト・ヘッド・フィールドは、削除されるビュー・オブジェクトをバイパスする。
【０４５５】
ステップ２１：compareAndSwap()機能を用いて、activated_blocker_and_view_countフィールド内のreclaim_in_progressフラグをオフしようとする。操作が失敗の場合、成功するまで操作を繰り返す。
【０４５６】
ステップ２２：前記ステップで再利用された過剰なブロッカ・オブジェクト、インスペクタ・ビュー・オブジェクト、及びミューテータ・ビュー・オブジェクトを削除する。
【０４５７】
要約：
前述の好適な実施例の幾つかの操作フィーチャは、次のように要約される。SharedChainオブジェクト及びその関連データ構造を使用することにより、妨害無しに、複数のリンクをリストにコンカレントに且つ同時に挿入及び削除することが可能になる。これはリスト全体のレベルではなく、リンク・レベルのアクセスをブロックすることにより達成される。特に、インスペクタ・オブジェクトは１度に１つだけのリンクを保護し（他のオブジェクトによる変更を阻止する）、反復ミューテータ・オブジェクトは、２つの連続リンクのスライディング・ウィンドウを保護する。挿入ポイントでは、ミューテータが２つの連続リンク（挿入されるリンクを含まない）内の少なくとも幾つかのデータを保護する。一方、削除ポイントでは、ミューテータが３つの連続リンク（削除されるリンクを含む）内の少なくとも幾つかのデータを保護する。
【０４５８】
インスペクタ・オブジェクトは一般に、ミューテータ・オブジェクトがリンク・リストを変更するために、その一部をブロックしたか否かに関わらずに、リンク・リストを自由にトラバースできる。インスペクタは、ミューテータによりブロックされた部分をトラバース（バイパス）できる。
【０４５９】
ミューテータは、リンクを挿入または削除するポイントを決定するために、リストをトラバースする能力を有するが、トラバースすることなく、リンクを任意の位置において挿入及び削除することも可能である（すなわち、リストの中央の任意のリンクを仮定）。リスト・トラバースを伴わない特定の挿入及び削除に対応して、２重リンク（順方向ポインタ及び逆方向ポインタ）が要求される。本発明の好適な実施例の全部の潜在性は、こうした２重リンク・リストにおいて実現され、そこではクライアントがリスト内のリンクを指し示すポインタを有し、複数のクライアントが同時に任意のリスト位置内にジャンプし、リンクを挿入または削除できる。リンク・リスト内の任意のポイントにおいて、複数の挿入及び削除を同時に行う能力が、リンクの参照カウントに依存しない。
【０４６０】
順序付け関係が、SharedChainオブジェクト内のリンクに対して定義され得る。例えば、各リンクは名前などのテキスト・データ・フィールドを含み、そこではテキスト・データ・フィールドがアルファベット順に整列されるように、リンクが順序付けされる。挿入ポイントを突き止めるためのミューテータによるリストのトラバース、並びに挿入の間の隣接リンク内でのポインタの保護により、リストに対して１つのSharedListオブジェクトが定義されれば、SharedListオブジェクトがリンクに関して、こうした順序付け関係を維持することができる。ミューテータはリストをトラバースし、正しい挿入ポイントが突き止められるまで、挿入されるリンクの適切なデータ・フィールドを現存のリンクのものと比較する。
【０４６１】
リンクを定義済みのアドレス境界（好適な実施例では１６バイト）上に配置し、同様にポインタを定義済みのアドレス境界（好適な実施例では８バイト）上のリンク内に配置することにより、幾つかのアドレス・ビットをフラグとして使用することが可能になる。このことは、アドレスそのものをスワップする同一のアトミック操作（例えばcompareAndSwap()）において、主要フラグ・ビットをスワップする利点を有する。
【０４６２】
以上、本発明の特定の実施例及び代替実施例について述べてきたが、当業者であれば、本発明の範囲から逸れることなく、その詳細及び形態において、追加の様々な変形が可能であることが理解できよう。
【０４６３】
まとめとして、本発明の構成に関して以下の事項を開示する。
【０４６４】
（１）リンク・リストを保持する方法であって、
更新タスクにより使用される前記リンク・リストの外部参照を含む、前記リンク・リストの補助データ構造を確立するステップと、
前記補助データ構造を通じて前記リストを更新する、第１の更新タスクを開始するステップと、
ブロッキング・データを前記補助データ構造内に記録することにより、前記補助データ構造を通じて前記リンク・リストをアクセスする他の更新タスクが、前記リンク・リストの全ての要素よりも少ない該リンク・リストの第１の部分を変更するのをブロックするステップと、
アクション・セットからアクションを実行することにより、前記リンク・リストの前記第１の部分内の該リンク・リストを更新するステップと
を含み、前記アクション・セットが、
ａ）前記リンク・リストから、該リンク・リストの前記第１の部分内の要素を削除するアクションと、
ｂ）前記リンク・リストの前記第１の部分内の該リンク・リストに要素を挿入するアクションと
を含む、方法。
（２）前記補助データ構造が、前記リストの被ブロック部分の直後のリスト要素の参照を含むバイパス要素のリストを含み、前記ブロッキング・データを記録するステップが、
前記リンク・リストの前記第１の部分の第１のリスト要素の参照を変更し、代わりにバイパス要素を参照するようにするステップを含み、
前記リンク・リストをトラバースするが、前記リンク・リストを変更しないタスクが、前記リンク・リストの前記第１の部分を通り過ぎ、前記バイパス要素を通じて前記リストをトラバースする、前記（１）記載の方法。
（３）前記リンク・リストが２重リンク・リストである、前記（１）記載の方法。
（４）前記ブロッキング・データを記録するステップによりブロックされる前記リンク・リストの前記第１の部分が、高々３つのリンクから成る、前記（１）記載の方法。
（５）前記補助データ構造を通じて、前記リンク・リストを更新する第２の更新タスクを開始するステップと、
ブロッキング・データを前記補助データ構造内に記録することにより、前記補助データ構造を通じて前記リンク・リストをアクセスする前記第２の更新タスク以外のタスクが、前記リンク・リストの全ての要素よりも少ない該リンク・リストの第２の部分を変更するのをブロックするステップと、
アクション・セットからアクションを実行することにより、前記リンク・リストの前記第２の部分内の該リンク・リストを更新するステップと
を含み、前記アクション・セットが、
ａ）前記リンク・リストから、該リンク・リストの前記第２の部分内の要素を削除するアクションと、
ｂ）前記リンク・リストの前記第２の部分内の該リンク・リストに要素を挿入するアクションと
を含み、前記第２の部分内の前記リンク・リストを更新するステップが、第１の部分内の前記リンク・リストを更新するステップと同時に実行される、前記（１）記載の方法。
（６）前記リンク・リスト内の任意のリンクを指し示すポインタを受け渡し、前記リンク・リストを変更するためのポイントを位置指定するステップを含み、前記ブロッキング・データを記録するステップによりブロックされる前記第１の部分が、少なくとも前記任意のリンクの一部を含む、前記（１）記載の方法。
（７）前記補助データ構造がオブジェクト指向プログラミング構造のクラス階層内のオブジェクトである、前記（１）記載の方法。
（８）前記クラス階層が、前記リンク・リストを変更することなく、該リンク・リストをトラバースするオブジェクトのための第１のクラスと、前記リンク・リストをトラバースし、該リンク・リストを変更するオブジェクトのための第２のクラスとを含む、前記（７）記載の方法。
（９）前記クラス階層が、前記リンク・リストを変更することなく該リンク・リストをトラバースし、リスト・レベルのブロッキング・アクセスを有するオブジェクトのための第３のクラスと、前記リンク・リストを変更することなく該リンク・リストをトラバースし、リンク・レベルのブロッキング・アクセスを有するオブジェクトのための第４のクラスと、前記リンク・リストをトラバースし、該リンク・リストを変更し、リスト・レベルのブロッキング・アクセスを有するオブジェクトのための第５のクラスと、前記リンク・リストをトラバースし、該リンク・リストを変更し、リンク・レベルのブロッキング・アクセスを有するオブジェクトのための第６のクラスとを含み、前記第３及び第４のクラスが前記第１のクラスから継承され、前記第５及び第６のクラスが前記第２のクラスから継承される、前記（８）記載の方法。
（１０）順序付け関係が前記リンク・リストに対して定義される、前記（１）記載の方法。
（１１）マルチタスク・コンピュータ・システムにおいて、２重リンク・リストを更新する方法であって、
前記２重リンク・リストの興味対象の領域内で、前記２重リンク・リストの全てのリンクよりも少ない第１の連続リンクのセットを識別するステップと、
第１のタスク以外のタスクが、前記第１の連続リンクのセットの少なくとも一部のリンクを変更するのをブロックする一方、前記第１のタスク以外のタスクが、前記第１のセットに含まれない前記２重リンク・リストのリンクを変更することをブロックしないステップと、
操作セットから操作を実行することにより、前記第１のセット内の前記２重リンク・リストを変更するステップであって、前記操作セットが、前記第１のタスクにより実行される操作、すなわち、
ａ）前記２重リンク・リストから前記第１のセットのリンクを削除する操作と、
ｂ）前記２重リンク・リスト内の前記第１のセットの２つのリンクの間に、リンクを挿入する操作と
を含む、変更するステップと、
前記変更するステップを実行後、前記第１のタスク以外のタスクが、前記第１のセットの少なくとも一部のリンクを変更するのをブロック解除するステップと
を含む、方法。
（１２）前記タスクをブロックするステップによりブロックされる前記リンク・リストの第１の連続リンクのセットが、高々３つのリンクから成る、前記（１１）記載の方法。
（１３）前記第１の連続リンクのセットを識別するステップが、前記リンク・リスト内の前記第１のセット内に存在する任意のリンクを指し示すポインタを受信し、前記リンク・リストを変更するためのポイントを位置指定するステップを含む、前記（１１）記載の方法。
（１４）前記２重リンク・リストの興味対象の領域内で、前記２重リンク・リストの全てのリンクよりも少ない第２の連続リンクのセットを識別するステップと、
第２のタスク以外のタスクが、前記第２の連続リンクのセットの少なくとも一部のリンクを変更するのをブロックする一方、前記第２のタスク以外のタスクが、前記第２のセットに含まれない前記２重リンク・リストのリンクを変更することをブロックしないステップと、
操作セットから操作を実行することにより、前記第２のセット内の前記２重リンク・リストを変更するステップであって、前記操作セットが、前記第２のタスクにより実行される操作、すなわち、
ａ）前記２重リンク・リストから前記第２のセットのリンクを削除する操作と、
ｂ）前記２重リンク・リスト内の前記第２のセットの２つのリンクの間に、リンクを挿入する操作と
を含む、変更するステップと、
前記第２のセット内の前記２重リンク・リストを変更するステップを実行後、前記第２のタスク以外のタスクが、前記第２のセットの少なくとも一部のリンクを変更するのをブロック解除するステップと
を含み、前記第２のセット内の前記２重リンク・リストを変更するステップが、前記第１のタスク以外のタスクが、前記第１のセットのリンクを変更するのをブロックするステップの後に、且つ前記第１のタスク以外のタスクが、前記第１のセットのリンクを変更するのをブロック解除するステップの前に実行される、前記（１１）記載の方法。
（１５）コンピュータ読取り可能媒体上に記録された複数のコンピュータ実行可能命令を含み、リンク・リストを保持するコンピュータ・プログラムであって、前記プログラムが、
更新タスクにより使用される前記リンク・リストの外部参照を含む、前記リンク・リストの補助データ構造を確立するステップと、
前記補助データ構造を通じて前記リストを更新する、第１の更新タスクを開始するステップと、
ブロッキング・データを前記補助データ構造内に記録することにより、前記補助データ構造を通じて前記リンク・リストをアクセスする他の更新タスクが、前記リンク・リストの全ての要素よりも少ない該リンク・リストの第１の部分を変更するのをブロックするステップと、
アクション・セットからアクションを実行することにより、前記リンク・リストの前記第１の部分内の該リンク・リストを更新するステップと
を含み、前記アクション・セットが、
ａ）前記リンク・リストから、該リンク・リストの前記第１の部分内の要素を削除するアクションと、
ｂ）前記リンク・リストの前記第１の部分内の該リンク・リストに要素を挿入するアクションと
をコンピュータに実行させるプログラム。
（１６）前記補助データ構造が、前記リストの被ブロック部分の直後のリスト要素の参照を含むバイパス要素のリストを含み、前記ブロッキング・データを記録するステップが、
前記リンク・リストの前記第１の部分の第１のリスト要素の参照を変更し、代わりにバイパス要素を参照するようにするステップを含み、
前記リンク・リストをトラバースするが、前記リンク・リストを変更しないタスクが、前記リンク・リストの前記第１の部分を通り過ぎ、前記バイパス要素を通じて前記リストをトラバースする、
前記（１５）記載のコンピュータ・プログラム。
（１７）前記リンク・リストが２重リンク・リストである、前記（１５）記載のコンピュータ・プログラム。
（１８）前記ブロッキング・データを記録するステップによりブロックされる前記リンク・リストの前記第１の部分が、高々３つのリンクから成る、前記（１５）記載のコンピュータ・プログラム。
（１９）前記プログラムが、
前記補助データ構造を通じて、前記リンク・リストを更新する第２の更新タスクを開始するステップと、
ブロッキング・データを前記補助データ構造内に記録することにより、前記補助データ構造を通じて前記リンク・リストをアクセスする前記第２の更新タスク以外のタスクが、前記リンク・リストの全ての要素よりも少ない該リンク・リストの第２の部分を変更するのをブロックするステップと、
アクション・セットからアクションを実行することにより、前記リンク・リストの前記第２の部分内の該リンク・リストを更新するステップと
を含み、前記アクション・セットが、
ａ）前記リンク・リストから、該リンク・リストの前記第２の部分内の要素を削除するアクションと、
ｂ）前記リンク・リストの前記第２の部分内の該リンク・リストに、要素を挿入するアクションと
を含み、前記第２の部分内の前記リンク・リストを更新するステップが、第１の部分内の前記リンク・リストを更新するステップと同時に実行される、前記（１５）記載のコンピュータ・プログラム。
（２０）前記プログラムが、前記リンク・リスト内の任意のリンクを指し示すポインタを受け渡し、前記リンク・リストを変更するためのポイントを位置指定するステップを含み、前記ブロッキング・データを記録するステップによりブロックされる前記第１の部分が、前記任意のリンクを含む、前記（１５）記載のコンピュータ・プログラム。
【図面の簡単な説明】
【図１】本発明の好適な実施例に従い、リンク・リスト・データ構造を使用するコンピュータ・システムの主要ハードウェア・コンポーネントを示すハイレベル・ブロック図である。
【図２】好適な実施例に従い、コンピュータ・システムのメモリ１０２の主要ソフトウェア・コンポーネントを示すハイレベル概念図である。
【図３】好適な実施例に従うリンク・リスト・データ構造を示す図である。
【図４】好適な実施例に従うリンク・リスト・データ構造内のオブジェクト・クラス・インヘリタンス階層を外部から見た図である。
【図５】好適な実施例に従うリンク・リスト・データ構造内のオブジェクト・クラス・インヘリタンス階層を外部から見た図である。
【図６】好適な実施例に従うリンク・リスト・データ構造内のオブジェクト・クラス・インヘリタンス階層を外部から見た図である。
【図７】好適な実施例に従う様々な外部クラスと内部クラスとの間の関係、及びそれらのインヘリタンス階層を示す図である。
【図８】好適な実施例に従う様々な外部クラスと内部クラスとの間の関係、及びそれらのインヘリタンス階層を示す図である。
【図９】好適な実施例に従う様々な外部クラスと内部クラスとの間の関係、及びそれらのインヘリタンス階層を示す図である。
【図１０】好適な実施例に従い、３つのリンクを有するSharedChainオブジェクト例を単純化して示した図である。
【図１１】好適な実施例に従い、リンク・リスト内の要素を参照するためにビュー・オブジェクトが使用される様子を示す図である。
【図１２】好適な実施例に従い、リンクをブロックしたブロッカ・オブジェクトの例を示すもので、ShareChainオブジェクト、ブロッカ・オブジェクト、及びリンク間の関係を示す図である。
【図１３】好適な実施例に従い、２つの他のリンク間のチェーン内にリンクを挿入するために必要なリンク・ポインタをブロックした、ミューテータのブロック・オブジェクトの例を示す図である。
【図１４】好適な実施例に従い、チェーンからリンクを除去するために必要なリンク・ポインタをブロックした、ミューテータのブロック・オブジェクトの例を示す図である。
【図１５】好適な実施例に従い、反復ミューテータの複数のビュー・オブジェクトとブロッカ・オブジェクトとの間の対話の例を示す図である。
【図１６】好適な実施例に従い、反復ミューテータの複数のビュー・オブジェクトとブロッカ・オブジェクトとの間の対話の例を示す図である。
【符号の説明】
１００  コンピュータ・システム
１０１  中央処理システム（ＣＰＵ）
１０２  主メモリ
１０３  関連キャッシュ
１０５、１０９  メモリ・バス
１１０  システムＩ／Ｏバス
１１１、１１２、１１３、１１４、１１５  Ｉ／Ｏ処理ユニット（ＩＯＰ）
１２１、１２２、１２３  直接アクセス記憶装置
２０１  オペレーティング・システム
２０２  データベース
２０３、２０４、２０５  アプリケーション
２１０、２１１、２１２  リンク・リスト・データ構造
３０１  SharedList<T>オブジェクト
３０２、３０３  クライアント・リンク・オブジェクト
４０１  SharedListIterator<T>
４０２  SharedListInspector<T>
４０３  SharedListMutator<T>
４０４  SharedListAtomicInspector<T>
４０５  SharedListNonatomicInspector<T>
４０６  SharedListNonatomicMutator<T>
４０７  SharedListAtomicMutator<T>
６０１  sharedChainオブジェクト
６０２  first_link_pointerフィールド
６０３  last_link_pointerフィールド
７０１、７０２  ビュー・オブジェクト
７０５  curPtr
７０６、１１１５  curLink
８０１  ブロッカ・オブジェクト
８０２  next_linkフィールド
８０３  ポインタ
８０５  順方向リンク・ポインタ
９０１  "リンクＡ"内の順方向リンク・ポインタ
９０２  "リンクＣ"内の逆方向リンク・ポインタ
１００１  previous_link_pointerフィールド
１００２  前リンク内の順方向ポインタ
１００３  削除されるリンク内の逆方向ポインタ
１００４  削除されるリンク内の順方向ポインタ
１００５  次のリンク内の逆方向ポインタ
１１０１、１１０２  ビュー・オブジェクト
１１０３、１１０４  ブロッカ・オブジェクト
１１１１  順方向リンク・ポインタ
１１１２  curPtrフィールド
１１１３  curLinkフィールド
１１１６  ブロッカ待機フィールド
【図１】
0003738976.tif 000003
【図２】
0003738976.tif 000004
【図３】
0003738976.tif 000005
【図４】
0003738976.tif 000006
【図５】
0003738976.tif 000007
【図６】
0003738976.tif 000008
【図７】
0003738976.tif 000009
【図８】
0003738976.tif 000010
【図９】
0003738976.tif 000011
【図１０】
0003738976.tif 000012
【図１１】
0003738976.tif 000013
【図１２】
0003738976.tif 000014
【図１３】
0003738976.tif 000015
【図１４】
0003738976.tif 000016
【図１５】
0003738976.tif 000017
【図１６】
0003738976.tif 000018