ZALLOCATEコマンドは、以前に予約された名前を解放せずに、指定された名前を予約します。他のGT.Mプロセスは、ZALLOCATEまたはLOCKコマンドを使用してZALLOCATE された名前を予約することはできません。
ZALLOCATEのコマンドは、いくつかの他のGT.Mの実装との互換性を提供します。M開発委員会(MDC)は、ZALLOCATEとZDEALLOCATEアプローチを取り入れるのではなく、LOCKコマンド(インクリメンタルロック)のための + と- のデリミタを追加することを採択しました。したがって、設計がインクリメンタルロックのメカニズムを必要とする時、LOCK +/- は、 ZALLOCATE / ZDEALLOCATEに対して、Mの標準の一部であることの利点があります。 LOCK+/- は、LOCKを使用してルーチンがネストされているときに対称的に働くという利点もあります。それは、プロセスが状態の変更なしの結果を生じさせることによって、既にZALLOCATEされ名付けられたリソースをプロセスによって発行されたZALLOCATEコマンドです。これは、同じプロセス(ルーチンのエントリ時)によって既にZALLOCATEされている名前付きリソース上でZDEALLOCATEに続くZALLOCATEを行うルーチンが、名付けられたリソース(希望されないことがある)をZDEALLOCATEすることになってしまうことを意味します。その一方で、LOCK + コマンドは、プロセスがインクリメントするLOCK( ZSHOW "L" の出力に見られる)のレベルを引き起こすことによって、既にLOCKされている名付けらたリソースのプロセスによって発行されました。その名前のリソース上ですべてのLOCK - コマンドは、LEVELがデクリメントされます。 LEVELが0になると、名前のリソースはもはやLOCKされなくなります。
GT.Mロックユーティリティ(LKE)でのLOCKのトラブルシューティングの詳細については、GT.Mの管理および操作ガイド に関する章を参照してください。
ZALLOCATEコマンドのフォーマットは:
ZA[LLOCATE][:tvexpr] [(]nref[,...][)][:intexpr][,...]
オプションでコマンド直後に続く真理値の式は、GT.Mがコマンドを実行するかどうかをコントロールする後置コマンドです。
nref 引数は、添字の有無、そして、前にキャレット( ^ )があろうとなかろうと、GT.M名のフォーマットで名前を指定します。
トランザクションの外で、環境中の一つのプロセスだけが、任意の時点で特定のリソース名をZALLOCATE(またはLOCK)できます。
GT.Mのデータストレージは階層散在配列を使用し、ZALLOCATEが複数のプロセスで不適切な "同時" アクセスからデータを保護するために提供されるので、ZALLOCATEは階層構造の様式でリソース名を扱います; ZALLOCATEは名前付きのリソースを保護するだけでなく、その上位と下位のノードも保護します。
1つ以上の nrefs がカッコ ()で囲まれている場合、ZALLOCATEは囲まれたすべての名前を "同時" にリザーブします、つまり、すべてが使用できるようになるまで、それらのどれをもリザーブします。
オプションの数値式は、失敗した場合にコマンドがタイムアウトすべきその後の時間を秒単位で指定します; 0秒 は単独で試みる結果です。ZALLOCATEコマンドが $ZMAXTPTIMEを超えないタイムアウトを指定し、リソース名が最後の再試行でロックされている場合、プロセスはデッドロックの可能性がないことを確認しながらTPNOACIDメッセージを生成することがあります。
間接指定演算子と1つ以上のZALLOCATEの引数リストに評価される原子式(expression atom)は、ZALLOCATEのための正当な引数を構成します。
GT.Mロックのメカニズムの詳細については、GT.M管理および運用ガイドのMロックユーティリティの章の"LOCK"の項を参照してください。
もしZALLOCATE コマンドがタイムアウトを指定し、GT.Mがタイムアウト時間が経過する前に名前付きリソースの所有権を取得した場合、ZALLOCATE は$TESTをTRUE(1)にセットします。 もしGT.Mが指定されたタイムアウト内の名前付きリソースの所有権を取得できない場合、ZALLOCATE は$TESTにFALSE(0)をセットします。 もしZALLOCATE コマンドがタイムアウトを指定しない場合、コマンドの実行は $TEST には影響しません。
nrefs のリストが与えられたとき、ZALLOCATEは、それぞれに指定されたタイムアウトを考慮に入れていることを指定された順序で左から右へ各 nref を予約することを試みます。もし nref を予約する前に timeout が経過した場合、GT.MはZALLOCATEコマンドを終了します。現在のZALLOCATEのコマンドの一部として既に取得されたいずれの nrefs は、取得をとどめます。
例:
ZAllocate A ZAllocate ^A ZAllocate ^A(1) ZAllocate (^B("smith"),^C("jones")) ZAllocate @A
1番目のコマンドは、 A を、 2番目は ^A を、3番目は ^A(1) を、4番目は ^B("smith") と ^C("jones") の両方を同時に ZALLOCATE します。最後のコマンドは、変数Aの値で指定されたリソースをZALLOCATE します。
例:
ZAllocate A,^B,@C ZALLOCATE (A,B,C)
もしZALLOCATEの引数が括弧で囲まれている場合、引数リスト内のすべての名前が、名前のいずれかを予約する前に、使用可能になるまで、コマンドは待機します。例えば、ステートメント ZA (A,B,C) では、 もしCという名前のリソースが利用できない場合、AとBが予約されるの前に C が利用可能になるまで、ZALLOCATEは待機します。上記の最初の行で示されるフォーマットを使用して、それらが利用可能になるようにリソース名は予約されるので、デッドロックを引き起こす可能性があります。
他のプロセスによって現在ZALLOCATEまたはLOCKされている(LOCKコマンドを使用して)名前を、プロセスがZALLOCATEしようとする時、他のプロセスが名前を解放するまでは、ZALLOCATEしているプロセスがハングアップします。名前が著しい期間使用できなく残っているイベントでは、タイムアウトは、プログラムの制御を回復するためにZALLOCATEを発行しているプロセスを可能にします。
例:
ZAllocate ^D:5
この例では、5秒のタイムアウトを指定します。もしGT.Mが5秒が経過する前に ^Dを予約するならば、ZALLOCATEは、$TESTをTRUEにセットします。もしGT.Mが5秒のタイムアウト内で ^Dを予約できないならば、ZALLOCATEは、$TESTをFALSEにセットします。
名前をZALLOCATEする時点で、ZALLOCATEまたはLOCKコマンドで以前に予約されている名前はリリースされていません(同様に、名前をロックすることは、ZALLOCATEされている名前を解放しません)。例えば、ZALLOCATE したA とBをLOCKした後、LOCKしているBはAをリリースしませんし、ZALLOCATEしているCは、AもBもリリースしません。
ZDEALLOCATE は、ZALLOCATEされているリソース名をリリースします。ZDEALLOCATEコマンドは、以前にZALLOCATEされた(ロックされていない)名前を解放することができます。
LOCKとZALLOCATEのためのリソース名の引数は交差します。つまり、もし1つのプロセスがLOCKまたはZALLOCATEを保持しているならば、別のプロセスは、最初のプロセスが保持するリソース名の階層に落ち込む名前を、LOCKもZALLOCATEもどちらもできません。プロセスがLOCKまたはZALLOCATEを保持しているときに、その同じプロセスも、現在保有するリソース名の階層に落ち込むリソース名をLOCKまたはZALLOCATEすることができる。単一のプロセスがLOCKとZALLOCATEの両方を保持しているときに、LOCKはZALLOCATEされるリソースをリリースしませんし、ZDEALLOCATEはLOCKされたリソースをリリースしません。
また、この章で後述しているZDEALLOCATEコマンドの説明を参照してください。
例:
Lock ^AR(PNT) . . . ZAllocate ^AR(PNT,SUB) . . . Lock ^TOT(TDT) . . ZDEALLOCATE ^AR(PNT,SUB)
この ^AR(PNT) とその下位ノードすべてをLOCKし、その後、いくつかの不特定のコマンドを実行した後、それは ^AR(PNT,SUB) をZALLOCATEします。ZALLOCATEは、LOCKまたは既存のZALLOCATEされたリソース名への変更を伴いません、したがって、^AR(PNT) のLOCK は、効果があるまま残ります。^AR(PNT,SUB) は既にLOCKによって保護されています。次に、符号なしのLOCKは、プロセスによって現在LOCKされているすべてのリソース名をリリースするため、ルーチンは ^TOT(TDT) のLOCKで ^AR(PNT) をリリースします。これは、^AR(PNT,SUB) のZALLOCATEを残します。名前 ^ARと^AR(PNT) を除くすべての添字と^AR(PNT,SUB) で始まるそれらは、他のプロセスによってロックすることに利用できます。最後に、ZDEALLOCATEコマンドを使用して、ルーチンは ^AR(PNT,SUB) をリリースします。ZDEALLOCATEは ^TOT(TDT) のLOCKには影響しません。この例では、LOCK、ZALLOCATE、ZDEALLOCATEの間の相互作用を説明するために作成されていて、サウンドプログラミングの実践を説明するためではないことに注意してください。
ZALLOCATEコマンドが、以前に予約された名前をリリースせずに名前を予約するので、それはデッドロックにつながることがあります。例えば、もし2人のユーザーが、次のような順序で、名前 A と BとをZALLOCATEする場合、デッドロックが発生します。
デッドロックを避けるため、タイムアウトを使用してください。符号なしのLOCKがが常に前に予約された名前をリリースするには、このようなロックは本質的にデッドロックを防ぎます。
ZALLOCATE 操作概要 | ||
---|---|---|
以前の状態(PREEXISTING CONDITION) |
発行されるコマンド(COMMAND ISSUED) |
結果(RESULT) |
他のユーザが、M を予約した |
ZA M |
あなたのプロセスは待ち状態 |
LOCK M |
あなたのプロセスは待ち状態 |
|
ZD M |
影響なし |
|
あなたが、ZA M で、M を予約した You reserved M with LOCK M |
ZA M |
M は、ZALLOCATEされLOCKされ。;Mをクリアするために ZDEALLOCATE と LOCK (L or L -M) の両方を使ってください。 |
LOCK M |
Mをリリースし、再び M を予約します。 |
|
ZD M |
影響なし |
|
あなたが、ZA M で、M を予約した You reserved M with LOCK M with ZA M |
ZA M |
影響なし |
LOCK M |
M は、ZALLOCATEされLOCKされ。;Mをクリアするために ZDEALLOCATE と LOCK (L or L -M) の両方を使ってください。 |
|
ZD M |
影響なし |