Allgemeines
Anwendungsgebiet: | Distributed-Lock-Manager (DLM); siehe "Distributed-Lock-Manager (DLM)" |
Makrotyp: | S-Typ, MF-Format 3: C-/D-/L-/M-/E-Form; siehe "S-Typ-Makroaufrufe" |
Makrobeschreibung
Der Makro LKCVT konvertiert eine existierende Lock-Anforderung. Der Lock muss mit dem Makro LKENQ erstellt und eine Lock-Kurzkennung muss zurück geliefert worden sein.
Diese Lock-Kurzkennung (LOCKID) muss beim Aufruf des Makros LKCVT mit angegeben werden. Die Lock-Anforderung des Benutzers wird über die Lock-Kurzkennung identifiziert.
Die Lock-Anforderung wird in die CONVERTING-Warteschlange des Locks eingereiht. Kann der Lock zugeteilt werden, wird er in die GRANTED-Warteschlange eingereiht. Der Makro LKCVT wurde erfolgreich ausgeführt.
Die Lock-Anforderung kann synchron oder asynchron erfolgen.
Bei einer asynchronen Lock-Anforderung wird der Lock sobald wie möglich zugeteilt. Die ausgewählte Ereignissteuerung wird gestartet und die Zuteilung wird dem aufrufenden Programm mitgeteilt.
Während der Zuteilung (Konvertierung von einem schwächeren in einen stärkeren Lock-Schutz), kann der Benutzer angeben, dass der Lock-Value-Block gelesen werden soll (LVBCTL=*MOVE).
Während der Freigabe (Konvertierung von einem PW- oder EX-Modus in einen schwächeren Lock-Schutz), kann der Benutzer angeben, dass der Lock-Value-Block geändert werden soll (LVBCTL=*MOVE).
Makroaufrufformat und Operandenbeschreibung
LKCVT |
MF=C / D / L / M / E ,ASYNCTL=*SYNCH / *ASYNCH / <var: enum-of _asyncctl_s:1> ,CONTROL=*STD / *EXPRESS / <var: enum-of _ctltype_s:1> ,GRANTID=0 / <var: int:4> ,GRTEVTT=*SYNCH / *TUCONTI / *TUEVENT / <var: enum-of _evttype_s:1> ,HOLDTIM=*INFINITE / *SYSTEM / <var: int:2> / <integer 0..32767> ,LCKMODE=*NU / *CR / *CW / *PR / *PW / *EX / <var: enum-of _lckmode_s:1> ,LOCKID=0 / <var: int:4> ,LSBADR=<var: pointer> ,LVBCTL=*IGNORE / *MOVE / <var: enum-of _lvbctl_s:1> ,RELEVTT=*NO / *TUCONTI / *TUEVENT / <var: enum-of _evttype_s:1> ,RELID=0 / <var: int:4> ,STATUS=*UNCHANGE / *RESET / *INVALIDATE / <var: enum-of _status_s:1> ,USERPAR=0 / <var: int:4> ,WAITTIM=*STD / *INFINITE / <var: int:2> / <integer 0..32767> ,WAITTYP=*TIME / *IMMEDIATE / <var: enum-of _timetype_s:1> ,PARAM=<var: pointer> / (reg: pointer>) ,PREFIX=N / p ,MACID=LDC / mac |
In der nachfolgenden Operandenbeschreibung sind die Operanden alphabetisch geordnet.
ASYNCTL=
Zuteilungssteuerung einer asynchronen Lock-Anforderung. Kann die Lock-Anforderung sofort zugeteilt werden, kann ein Contingency-Prozess oder ein Ereignis-Signal unterdrückt werden.
*SYNCH
Kann die Lock-Anforderung sofort zugeteilt werden, wird ein Contingency-Prozess oder ein Ereignis-Signal unterdrückt.
*ASYNCH
Auch wenn die Lock-Anforderung sofort zugeteilt werden kann, wird ein Contingency-Prozess oder ein Ereignis-Signal erstellt.
<var: enum-of _asyncctl_s:1>
Name des Feldes mit der Zuteilungssteuerung der asynchronen Lock-Anforderung zum Ausführungszeitpunkt.
CONTROL=
Gibt die Steuerungs-Optionen für die Konvertierungs-Anforderung an.
*STD
Standard-Steuerung der Konvertierungs-Anforderung.
*EXPRESS
Die Konvertierungs-Anforderung soll ausgeführt werden, bevor andere Konvertierungs-Anforderungen ausgeführt werden. Dieser Operanden-Wert sollte nur dann angegeben werden, wenn der konvertierte Lock-Modus sehr schnell wieder freigegeben wird.
<var: enum-of _ctltype_s:1>
Name des Feldes mit dem Wert, den der Benutzer festgelegt hat.
GRANTID=
Kurzkennung für die Lock-Zuteilung. Gibt an, welche Contingency-Kurzkennung oder Ereigniskennung bei asynchronen Lock-Anforderungen die Information erhält, dass der Lock jetzt zugeteilt wurde.
<var: int:4>
Voreinstellung ist 0.
Die Contingency-Kurzkennung oder Ereigniskennung.
GRTEVTT=
Beschreibt in welcher Art Informationen über die Lock-Zuteilung zurückgeliefert werden sollen. Es gibt es eine synchrone und zwei asynchrone Methoden zur Steuerung. Die angegebene Kurzkennung (Contingency-Kurzkennung oder Ereigniskennung) ist für die aktuelle Lock-Anforderung gültig. Andere Lock-Anforderungen von anderen Tasks können andere Kurzkennungen angeben.
*SYNCH
Synchrone Lock-Anforderung. Rücksprung aus dem Makro, wenn der Lock zugeteilt oder eine Fehlerbedingung erkannt wurde. Die Zuteilungs-Information wird im Returncode zurückgeliefert.
*TUCONTI
Contingency-Prozess. Dieser Wert muss angegeben werden, um eine Bestätigung der Zuteilungs-Anforderung während der Contingency-Verarbeitung zu erhalten. Der Benutzer wird über inkompatible Zuteilungs-Anforderungen informiert, die von anderen Benutzern in die Warteschlange eingereiht wurden. Die Freigabe-Contingency wird gestartet, wenn sich der Lock in einem inkompatiblen Lock-Modus befindet.
*TUEVENT
Ereignissteuerung (Eventing). Um die Zuteilungs-Information zu erhalten, kann eine Ereignisvariable benutzt werden. Durch Aufruf des SOLSIG-Makros wird die Zuteilungs-Information geliefert. Die inkompatiblen Zuteilungs-Anforderungen von anderen Tasks werden über die selbe Ereignisvariable gemeldet.
<var:enum-of _evttype_s:1>
Name des Feldes mit dem Zuteilungs-Ereignis-Typ zum Ausführungszeitpunkt.
HOLDTIM=
Die Haltezeit ist die Zeit, die der Lock-Halter den Lock halten will. Nach Ablauf der Haltezeit wird ein Freigabe-Ereignis vom DLM erzeugt, damit der Lock-Halter seine Lock-Anforderung abschwächen bzw. freigeben kann.
Darf nur zusammen mit dem Operanden RELEVTT angegeben werden.
*INFINITE
Kein Haltezeitlimit.
*SYSTEM
Vom Betriebssystem definierte Haltezeit.
<var: int:2>
Vom Benutzer festgelegte Haltezeit in Sekunden.
<integer 0..32767>
Direkte Angabe der Haltezeit in Sekunden.
LCKMODE=
Gibt den angeforderten Lock-Modus an.
*NU
Der Lock befindet sich im Null-Modus und ist immer zugeteilt. Er ist mit allen anderen Lock-Anforderungen kompatibel. Ein Zugriff auf die Ressource ist aber nicht erlaubt.
*CR
Der Lock befindet sich im Concurrent-Read-Modus. Erlaubt sind andere Locks nur im Null-Modus, im Concurrent-Read-Modus, im Concurrent-Write-Modus, im Protected-Read-Modus und im Protected-Write-Modus. Dem Lock-Halter wird ein ungeschützter Lesezugriff auf die Ressource gewährt.
*CW
Der Lock befindet sich im Concurrent-Write-Modus. Erlaubt sind andere Locks nur im Null-Modus, im Concurrent-Write-Modus oder im Concurrent-Read-Modus. Dem Lock-Halter wird ein ungeschützter Schreibzugriff auf die Ressource gewährt.
*PR
Der Lock befindet sich im Protected-Read-Modus. Erlaubt sind andere Locks nur im Null-Modus, im Concurrent-Read-Modus oder im Protected-Read-Modus. Dem Lock-Halter wird ein geschützter Lesezugriff auf die Ressource gewährt.
*PW
Der Lock befindet sich im Protected-Write-Modus. Erlaubt sind andere Locks nur im Null-Modus und im Concurrent-Read-Modus. Dem Lock-Halter wird ein geschützter Schreibzugriff auf die Ressource gewährt.
*EX
Der Lock befindet sich im Exklusiv-Modus. Erlaubt sind andere Locks nur im Null-Modus. Nur der Lock-Halter darf auf die Ressource zugreifen.
<var: enum-of _lckmode_s:1>
Name des Feldes mit dem Lock-Modus.
LOCKID=
Lock-Kurzkennung des Locks, der konvertiert werden soll.
<var: int:4>
Voreinstellung ist 0.
Lock-Kurzkennung, die vom LKENQ-Makro zurückgeliefert wurde.
LSBADR=
Feld mit der Adresse des Lock-Status-Blocks. Der Lock-Status-Block enthält den Lock-Value-Block.
<var: pointer>
Name des Feldes mit der Adresse des Lock-Status-Blocks.
LVBCTL=
Steuerung des Lock-Value-Blocks.
*IGNORE
Der Lock-Value-Block wird nicht benutzt.
*MOVE
Den Lock-Value-Block lesen oder schreiben. Der Lock-Value-Block kann gelesen werden, wenn der Lock zugeteilt wird. Er kann geschrieben werden, wenn der Lock im PW- oder EX-Modus freigegeben wird.
<var: enum-of _lvbctl_s:1>
Name des Feldes mit der Steuerung des Lock-Value-Blocks zum
Ausführungszeitpunkt.
MF=
Zur allgemeinen Beschreibung des Operanden MF, der dazugehörenden Operandenwerte und der evtl. nachfolgenden Operanden (z.B. PREFIX, MACID und PARAM) siehe Abschnitt „S-Typ-Makroaufrufe“. Die gültigen MF-Werte sind zu Beginn der Makrobeschreibung bei „Makrotyp“ angegeben und aus dem Aufrufformat ersichtlich.
Bei der C-Form, D-Form oder M-Form des Makroaufrufs kann ein Präfix PREFIX und bei der C-Form oder M-Form zusätzlich eine Macid MACID angegeben werden.
RELEVTT=
Beschreibt in welcher Art Informationen über die Lock-Freigabe zurückgeliefert werden sollen. Es gibt zwei asynchrone Methoden zur Steuerung. Die angegebene Kurzkennung (Contingency-Kurzkennung oder Ereigniskennung) ist für die aktuelle Lock-Anforderung gültig.
*NO
Es werden keine Informationen über andere inkompatible Lock-Anforderungen die diesen Lock betreffen ausgegeben. Dies kann zu Deadlock-Problemen führen, wenn
der Lock nicht freigegeben ist. Ist die angegebene Haltezeit für diesen Lock abgelaufen, wird der Lock-Halter dieser Lock-Anforderung ohne weitere Meldung beendet.
*TUCONTI
Contingency-Prozess. Dieser Wert muss angegeben werden, um eine Bestätigung der Freigabe-Anforderung während der Contingency-Verarbeitung zu erhalten. Der Benutzer wird über inkompatible Zuteilungs-Anforderungen informiert, die von anderen Benutzern in die Warteschlange eingereiht wurden. Die Freigabe-Contingency wird gestartet, wenn sich der Lock in einem inkompatiblen Lock-Modus befindet.
*TUEVENT
Ereignissteuerungs (Eventing). Um die Freigabe-Information zu erhalten, kann eine Ereignisvariable benutzt werden. Durch Aufruf des SOLSIG-Makros wird die Zuteilungs-Information geliefert. Die inkompatiblen Zuteilungs-Anforderungen von anderen Tasks werden über die selbe Ereignisvariable gemeldet.
<var:enum-of _evttype_s:1>
Name des Feldes mit dem Freigabe-Ereignis-Typ zum Ausführungszeitpunkt.
RELID=
Kurzkennung für die Lock-Freigabe. Gibt an, welche Contingency-Kurzkennung oder Ereigniskennung die Information erhält, dass die Lock-Anforderung eine andere Lock-Anforderung eines anderen Benutzers blockiert.
<var: int:4>
Voreinstellung ist 0.
Die Contingency-Kurzkennung oder Ereigniskennung.
STATUS=
Lock-Status-Änderungsparameter.
Gibt an, ob der Lock-Status zurückgesetzt (= validated) wird, wenn ein Lock im PW- oder EX-Modus freigegeben wird.
*UNCHANGE
Während der Freigabe eines Locks im PW- oder EX-Modus wird der Lock-Status nicht verändert.
*RESET
Während der Freigabe eines Locks im PW- oder EX-Modus wird der Lock-Status wieder auf VALID gesetzt.
*INVALIDATE
Während der Freigabe eines Locks im PW- oder EX-Modus wird der Lock-Status auf INVALID gesetzt.
<var: enum-of _status_s:1>
Name des Feldes mit dem Lock-Status-Änderungsparameter zum
Ausführungszeitpunkt.
USERPAR=
Die Parameter für asynchrone Mitteilungen, die an den Contingency-Prozess oder an die Ereignissteuerung übergeben werden sollen.
<var: int:4>
Voreinstellung ist 0.
Benutzerdefinierte Werte.
WAITTIM=
Die Wartezeit ist die Zeit, die gewartet werden soll, bis der Lock zugeteilt ist.
*STD
Standard-Wartezeit. Bei Angabe von WAITTYP=*IMMEDIATE wird der Lock sofort zugeteilt oder der Auftrag beendet. Falls die Bearbeitung des Auftrages verzögert wird (Cluster, Netz) wird 600 Sekunden gewartet.
*INFINITE
Die Lock-Anforderung überschreitet niemals das Zeitlimit. Die Lock-Anforderung wartet solange bis der Lock zugeteilt oder eine Deadlock-Situation erkannt wird.
<var: int:2>
Vom Benutzer festgelegte Wartezeit in Sekunden.
<integer 0..32767>
Direkte Angabe der Wartezeit in Sekunden.
WAITTYP
Gibt die Wartezeit-Art für wartende Lock-Anforderungen an.
*TIME
Der Wert der Wartezeit wird über den Operanden WAITTIM angegeben.
*IMMEDIATE
Sofort-Lock-Anforderung. Die Lock-Anforderung wird nicht in die Warteschlange eingereiht, wenn sie nicht sofort zugeteilt werden kann. Der Wert für die Zeitüberschreitung kann über den Operanden WAITTIM angegeben werden. Dieser Wert wird verwendet, wenn die Behandlung der Lock-Anforderung zu einem DLM-internen Warte-Zustand führt. Dies kann z.B. auftreten, wenn eine Netzwerk-Verbindung nicht mehr zur Verfügung steht, nachdem die Lock-Anforderung zur Verarbeitung an einen anderen Knoten gesendet wurde. Die notwendige Antwort wird dadurch von diesem anderen Knoten niemals übertragen. Um dies zu verhindern, kann der Benutzer eine Wartezeit über den Operanden WAITTIM angeben.
<var: enum-of _timetype_s:1>
Benutzer-definierte Werte.
Rückinformation und Fehleranzeigen
Standardheader:
+---------------+ | | | | | |c|c|b|b|a|a|a|a| +---------------+
Über die Ausführung des Makros LKCVT wird im Standardheader folgender Returncode übergeben (cc=Subcode2, bb=Subcode1, aaaa=Maincode):
X'cc' | X'bb' | X'aaaa' | Erläuterung |
X'00' | X'00' | X'0000' | Der Makro wurde normal ausgeführt. Die Lock-Anforderung wurde in |
X'00' | X'00' | X'0001' | Der Makro wurde normal ausgeführt. Die Lock-Anforderung wurde in die |
X'00' | X'00' | X'0002' | Der Makro wurde ausgeführt. Der Lock wurde im angeforderten Lock- |
X'00' | X'01' | X'1005' | Der Lock-Status-Block ist nicht verfügbar. |
X'00' | X'01' | X'1006' | Der Typ von GRANTID ist nicht derselbe wie in GRTTYPE vereinbart. |
X'00' | X'01' | X'1007' | Der Typ von RELID ist nicht derselbe wie in RELTYPE vereinbart. |
X'00' | X'01' | X'1008' | Ungültige Kombination von GRTEVTT und RELEVTT. |
X'00' | X'01' | X'1009' | Die Angabe im Operanden WAITTIM ist ungültig. |
X'00' | X'01' | X'100A' | Die Angabe im Operanden HOLDTIM ist ungültig. |
X'00' | X'01' | X'100C' | Die Angabe im Operanden LOCKID ist ungültig. |
X'00' | X'01' | X'1015' | Die Angabe im Operanden LCKMODE ist ungültig. |
X'00' | X'01' | X'10FF' | Es wurde ein falscher Parameter angegeben, der keinen spezifischen |
X'00' | X'20' | X'2001' | Es trat ein interner Fehler auf. |
X'00' | X'20' | X'2003' | Es trat ein interner Fehler im Zusammenhang mit dem Ressourcen- |
X'00' | X'20' | X'2004' | Es trat ein interner Fehler im Zusammenhang mit Zeitlimitüberschreitung |
X'00' | X'20' | X'2005' | Es trat ein interner Fehler im Zusammenhang mit der Lock-Anforderung |
X'00' | X'20' | X'2006' | Es trat ein interner Fehler im Zusammenhang mit XCS auf. |
X'00' | X'40' | X'4001' | Ein Deadlock wurde entdeckt. |
X'00' | X'40' | X'4003' | Die vorherige Lock-Anforderung ist noch nicht beendet. |
X'00' | X'82' | X'8002' | Das Zeitlimit wurde überschritten. |
X'00' | X'82' | X'8004' | Der Lock wurde bereits aus der Warteschlange freigegeben. |
X'00' | X'82' | X'8005' | Der Lock wurde bereits gelöscht. |
X'00' | X'82' | X'8006' | Sofort-Lock-Anforderungen sind nicht möglich. Es existieren inkompatible |
Weitere Returncodes, deren Bedeutung durch Konvention makroübergreifend festgelegt ist, können der Tabelle „Standard-Returncodes“ (Standardheader) entnommen werden.