Allgemeines
Anwendungsgebiet: | Memory Pool Technik; siehe "Gemeinsamer Speicherbereich für mehrere Anwender (Memory Pool)" |
Makrotyp: | S-Typ, MF-Format 1: Standardform/L-/E-Form; siehe "S-Typ-Makroaufrufe" |
Ein Anwender kann explizit (zusammenhängenden) Speicherplatz in einem Memory Pool anfordern (REQMP) und auch wieder freigeben (RELMP). Für die Freigabe von Speicherplatz in einem Memory Pool gilt:
der Aufrufer muss Pool-Teilnehmer sein (ENAMP),
es ist ohne Bedeutung, wer von den Pool-Teilnehmern den Speicherplatz angefordert hatte und in welchen Portionen dies erfolgte.
Makrobeschreibung
Mit dem Makro RELMP kann der Anwender zusammenhängenden Speicherplatz in einem Memory Pool freigeben. Die Freigabe erfolgt in Speicherseiten (4KB).
Hinweise
Ein Memory Pool wird über den Pool-Namen oder über seine Kurzkennung (siehe ENAMP) angesprochen.
Die Freigabe von Poolseiten verändert nicht die im ENAMP-Aufruf festgelegte Größe eines Memory Pools.
Der freizugebende Speicherplatz muss nicht zusammenhängend zugewiesen worden sein.
RELMP wird abgewiesen, wenn für den Memory Pool mit CSTMP Schreibschutz vereinbart wurde.
Makroaufrufformat und Operandenbeschreibung
RELMP |
{ {MPNAME=name / MPNAMAD={adr / (r)}[,MPNAMLN={länge / (r)}]} [,SCOPE={LOCAL / GROUP / USER_GROUP / GLOBAL}] / MPID={adr / (r)} } [,ADDR=adr / (r)] [,BSIZE=anzahl / (r) / ALL] [,PARMOD=24 / 31] [,MF=L / (E,..)] |
MPNAME=
beschreibt den Namen des Memory Pools (Verbindung mit Operand SCOPE beachten).
name
Name des Memory Pools.
MPNAMAD=
beschreibt die Adresse des Feldes mit name (Verbindung mit Operand SCOPE beachten).
adr
symbolische Adresse (Name) des Feldes.
(r)
r = Register mit dem Adresswert des Feldes.
MPNAMLN=
bezeichnet die Länge des unter MPNAMAD angegebenen Namens.
Wenn nicht spezifiziert:
Längenattribut des Feldes adr oder 54 Byte, wenn MPNAMAD=(r) angegeben wurde.
länge
Länge in Byte.
(r)
r = Register, das länge enthält.
SCOPE=
beschreibt den Geltungsbereich (Teilnehmerkreis) des Memory Pools. Die Angabe dient der eindeutigen Identifizierung des Memory Pools und muss immer in Verbindung mit dem Operanden MPNAME bzw. MPNAMAD spezifiziert werden.
LOCAL
Der Memory Pool wird nur von dem einrichtenden Teilnehmer benutzt.
GROUP
Teilnehmer können alle Tasks unter der Benutzerkennung des einrichtenden Teilnehmers sein.
USER_GROUP
Teilnehmer können alle Tasks sein, deren Benutzerkennungen der gleichen Benutzergruppe angehören wie die Benutzerkennung des einrichtenden Teilnehmers. Der Operandenwert setzt die Existenz von Benutzergruppen voraus und kann daher nur angegeben werden, wenn die Funktionseinheit SRPM des Software-Produkts SECOS im System vorhanden ist. Vor einem Makroaufruf mit SCOPE=USER_GROUP muss deshalb mit dem Makro GETUGR (siehe Handbuch „SECOS“ [14]) geprüft werden, ob SRPM zur Verfügung steht; abhängig vom Ergebnis (Returncode) ist im Programm zu reagieren.
GLOBAL
Teilnehmer können alle im System laufenden Tasks sein.
MPID=
beschreibt die Adresse eines Feldes (Länge = 4 Byte) mit der Kurzkennung für den Memory Pool (siehe auch ENAMP). Die Kurzkennung identifiziert den Memory Pool eindeutig; die Angabe beschleunigt die Verarbeitung.
adr
symbolische Adresse (Name) des Feldes mit der Kurzkennung.
(r)
r = Register mit dem Adresswert des Feldes.
ADDR=
bezeichnet die Anfangsadresse des Speicherbereichs, der freigegeben werden soll. Die Adresse muss auf eine 4KB-Grenze ausgerichtet sein. Der gesamte Bereich muss im angegebenen Memory Pool liegen.
Hinweis
Der Operand ADDR muss spezifiziert werden, wenn nicht BSIZE=ALL angegeben wird.
adr
Anfangsadresse.
(r)
r = Register mit der Anfangsadresse.
BSIZE=
beschreibt die Größe des freizugebenden Speicherbereichs in Speicherseiten (4 KB). Voreinstellung: BSIZE=1.
Hinweis
Die Angabe BSIZE=0 ist erlaubt: Es wird kein Speicherplatz freigegeben.
anzahl
Anzahl der Speicherseiten.
(r)
r = Register, das anzahl enthält.
ALL
Alle für den Memory Pool angeforderten Speicherseiten werden freigegeben. Diese Angabe kann auch im Register r, in der Form C' ALL', erfolgen.
MF=
Zur allgemeinen Beschreibung des Operanden MF, der dazugehörenden Operandenwerte und der evtl. nachfolgenden Operanden (z.B. für einen Präfix) siehe Abschnitt „S-Typ-Makroaufrufe“. Die gültigen MF-Werte sind zu Beginn der Makrobeschreibung bei „Makrotyp“ angegeben und aus dem Aufrufformat ersichtlich.
PARMOD=
steuert die Makroauflösung. Es wird entweder die 24-Bit- oder die 31-Bit-Schnittstelle generiert.
Wenn PARMOD nicht spezifiziert wird, erfolgt die Makroauflösung entsprechend der Angabe für den Makro GPARMOD oder der Voreinstellung für den Assembler (= 24-Bit-Schnittstelle).
24
Die 24-Bit-Schnittstelle wird generiert; Datenlisten benutzen 24-Bit-Adressen (Adressraum <= 16 MB).
31
Die 31-Bit-Schnittstelle wird generiert. Datenlisten benutzen 31-Bit-Adressen (Adressraum <= 2 GB) und beginnen mit dem Standardheader.
Rückinformation und Fehleranzeigen
Nach der Makrobearbeitung enthält Register R1 die Adresse des Datenbereichs.
R15:
+---------------+ | | | | | |b|b|0|0|0|0|a|a| +---------------+
Über die Ausführung des Makros RELMP wird ein gegliederter Returncode (aa=primärer RC, bb=sekundärer RC) im Register R15 übergeben.
aa = X'00': normale Ausführung,
aa = X'04': Funktion nicht ausgeführt.
X'bb' | X'aa' | Erläuterung |
X'00' | X'00' | Normale Ausführung. Speicherseiten wurden freigegeben. |
X'18' | X'00' | Normale Ausführung. Speicherseiten wurden freigegeben; innerhalb des angegebenen |
X'04' | X'04' | Funktion nicht ausgeführt. Aufrufer ist kein Memory-Pool-Teilnehmer (kein |
X'18' | X'04' | Funktion nicht ausgeführt. Ungültiger Speicherbereich:
|
X'1C' | X'04' | Funktion nicht ausgeführt. Operandenfehler:
Benennung nicht eindeutig. Es wurde mehr als nur ein Operand spezifiziert (MP-
|
X'24' | X'04' | Funktion nicht ausgeführt. Berechtigungsfehler:
|
31-Bit-Schnittstelle:
Bei fehlerhafter Ausrichtung oder Initialisierung des Standardheaders werden im Register R15 zusätzlich die Returncodes X'0001FFFF' / X'0003FFFF' / X'0004FFFF' übergeben; siehe Tabelle „Standard-Returncodes“ (Standardheader).
Im Standardheader wird kein Returncode übergeben.