Allgemeines
Anwendungsgebiet: | Memory Pool Technik; siehe "Gemeinsamer Speicherbereich für mehrere Anwender (Memory Pool)" |
Makrotyp: | S-Typ, MF-Format 3: C-/D-/E-/L-/M-Form; siehe "S-Typ-Makroaufrufe" |
Ein Memory Pool (MP) ist ein Speicherbereich im Klasse-6-Speicher, der von mehreren Anwendern gemeinsam benutzt werden kann. Der Anwender, der den Memory Pool einrichtet, legt eine Größe (Lage), Bezeichnung (Name) und Speicherattribute fest.
Die Größe des Memory Pools und die Belegung der Speicherseiten können mit dem Makro MINF abgefragt werden.
Makrobeschreibung
Der Makro SHOWMP informiert über Common Memory Pools, die aktuell im System angelegt sind. Lokale Memory Pools werden nicht ausgegeben. Ausgegeben werden Name, Geltungsbereich und die Anzahl der angeschlossenen Tasks. Zusätzlich können auch die TSNs der angeschlossenen Tasks angefordert werden.
Der nicht-privilegierte Benutzer erhält in jedem Fall nur die nicht-privilegierten Memory Pools ausgegeben, an die eine Task seiner Benutzerkennung angeschlossen ist. Bei Auflistung der Sharer-Tasks werden nur Tasks der eigenen Benutzerkennung aufgelistet.
Zur Einschränkung der Informationsmenge bestehen folgende Möglichkeiten:
Ausgabe für einen bestimmten Namen bzw. Namensraum
Ausgabe für einen bestimmten Geltungsbereich
Ausgabe für Memory Pools mit bestimmten Eigenschaften
Zusätzlich kann festgelegt werden, wieviele TSNs bei der Ausgabe der angeschlossenen Tasks maximal aufgelistet werden sollen (Voreinstellung ist 45).
Privilegierte Funktionen
Der privilegierte Anwender (Privileg TSOS bzw. SW-MONITOR-ADMINISTRATION) kann sich über alle Memory Pools informieren. Ihm werden auch alle Sharer-Tasks unabhängig von der Benutzerkennung ausgegeben. Zur Auswahl von privilegierten Memory Pools steht ihm der Operand PRIV_POOL zur Verfügung.
Makroaufrufformat und Operandenbeschreibung
SHOWMP |
MF=D / E / L / C / M {,MPNAME={*ALL / '<name 1..54 with_wild>'} / [,MPNAMAD={A(name) / adr / (r)} ,MPNAMLN={<integer 1..54> / <var: int:4> / (<reg: integer 1..54>)}] } ,SCOPE=*ANY / *GLOBAL / *GROUP / *USER-GROUP {,GROUP_USERID={*ANY / *OWN / '<name 1..8>' / <var: name 8..8> / (<reg: A(name 8..8)>)} / ,USER_GROUPID={*ANY / *OWN / '<name 1..8>' / <var: name 8..8> / (<reg: A(name 8..8)>)} } ,SELECT=*ALL / *PAR ,PRIV_POOL=*ANY / *YES / *NO ,CONNECT=*ANY / *BY-USER / *BY-TASK {,USERID={*OWN / '<name 1..8>' / <var: name 8..8> / (<reg: A(name 8..8)>)} / ,TSN={*OWN / '<name 1..4>' / <var: name 4..4> / (<reg: A(name 4..4)>)} } ,INFO=*STD / *ALL ,NUMSHR=45 / <integer 1..4096> / <var: int:4> / (<reg: integer 1..4096>) ,INFO_AREA=adr / (r) ,INFO_LENGTH=1 / <integer 1..1024> / <var: int:4> / (<reg: integer 1..1024>) [,PARAM=adr / (r)] ,PREFIX=N / p ,MACID=VPI / macid ,XPAND=PARAM / INFA ,EQUATES=YES / NO] |
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.
MPNAME=
Bestimmt den Namen der Memory Pools, die ausgegeben werden sollen (Verbindung mit den Operanden SCOPE und SELECT beachten).
An Stelle dieses Operanden kann in unterschiedlichen MF-Varianten auch der Operand MPNAMAD verwendet werden, siehe die „Programmierhinweise“.
*ALL
Es werden alle Memory Pools ausgegeben.
'<name 1..54 with-wild>'
Nur der angegebene Memory Pool wird ausgegeben. Bei Angabe von Musterzeichen werden alle Memory Pools ausgegeben, deren Name mit der Musterzeichenfolge übereinstimmt. Das Musterzeichensymbol ist *
. Das erste Leerzeichen beendet den Namen bzw. die Musterzeichenfolge.
MPNAMAD=
Gibt die Adresse des Feldes mit den Namen der Memory Pools an (Verbindung mit den Operanden SCOPE und SELECT beachten). Das Musterzeichensymbol *
ist zulässig. Das erste Leerzeichen beendet den Namen bzw. die Musterzeichenfolge.
An Stelle dieses Operanden kann in unterschiedlichen MF-Varianten auch der Operand MPNAME verwendet werden, siehe die „Programmierhinweise“.
A(name)
Adresse des Feldes mit dem Namen der Memory Pools.
adr
Symbolische Adresse (Name) eines Hilfsfeldes, das die Adresse des Feldes mit dem Namen der Memory Pools enthält (nur für MF=M).
(r)
r = Register mit dem Adresswert des Feldes (nur für MF=M).
MPNAMLN=
Beschreibt die Länge des unter MPNAMAD angegebenen Namens. Obligatorische Angabe, wenn MPNAMAD verwendet wird. Sonst wird MPNAMLN ignoriert.
<integer 1..54>
Länge in Byte.
<var: int:4>
Symbolische Adresse (Name) des Feldes, das die Länge enthält (nur für MF=M).
(<reg: integer 1..54>)
reg = Register, das die Länge enthält (nur für MF=M).
SCOPE=
Gibt an, ob nur Memory Pools mit einem bestimmten Geltungsbereich ausgegeben werden sollen.
*ANY
Die Memory Pools werden unabhängig von ihrem Geltungsbereich ausgegeben.
*GLOBAL / *GROUP / *USER_GROUP
Die Memory Pools mit dem angegebenen Geltungsbereich werden ausgegeben.
GROUP_USERID=*ANY / *OWN / '<name 1..8>' / <var: name 8..8> /
(<reg: A(name 8..8)>)
Operand wird nur bei SCOPE=*GROUP ausgewertet.
Es werden nur Memory Pools ausgegeben, die von der angegebenen Benutzerkennung angelegt wurden. Dabei bezeichnet *OWN die Benutzerkennung der aufrufenden Task. Mit *ANY ist die Ausgabe unabhängig von der Benutzerkennung voreingestellt.
'<name 1..8>'
Angabe der Benutzerkennung.
<var: name 8..8>
Symbolische Adresse (Name) des Feldes, das die Benutzerkennung enthält (nur für MF=M).
(<reg:A(name 8..8))
reg = Register, das die Adresse des Feldes mit der Benutzerkennung enthält (nur für MF=M).
USER_GROUPID=*ANY / *OWN / '<name 1..8>' / <var: name 8..8> /
(<reg: A(name 8..8)>)
Operand wird nur bei SCOPE=*USER_GROUP ausgewertet.
Es werden nur Memory Pools ausgegeben, die von der angegebenen Benutzergruppe angelegt wurden. Dabei bezeichnet *OWN die Benutzergruppe, der die aufrufende Task angehört. Mit *ANY ist die Ausgabe unabhängig von der Benutzergruppe voreingestellt.
'<name 1..8>'
Angabe der Benutzergruppe.
<var: name 8..8>
Symbolische Adresse (Name) des Feldes, das den Namen der Benutzergruppe enthält (nur für MF=M).
(<reg:A(name 8..8))
reg = Register, das die Adresse des Feldes mit dem Namen der Benutzergruppe enthält (nur für MF=M).
SELECT=*ALL / *PAR
Gibt an, ob die durch den Memory-Pool-Namensbereich und SCOPE angegebene Menge von Memory Pools über Auswahlkriterien eingeschränkt werden soll (*PAR) oder nicht (*ALL).
PRIV_POOL=*ANY / *YES / *NO
Gibt bei SELECT=*PAR an, ob nur privilegierte Memory Pools (*YES, nur für nur privilegierte Benutzer zulässig) ausgegeben werden sollen. Bei Angabe von *NO werden keine privilegierten Memory Pools ausgegeben. *ANY zeigt die Memory Pools unabhängig von ihrer Privilegierung an.
CONNECT=
Gibt bei SELECT=*PAR an, ob die Memory Pools in Abhängigkeit von den angeschlossenen Tasks ausgegeben werden sollen. *ANY zeigt die Memory Pools unabhängig von den angeschlossenen Tasks an.
*BY-USER
Es werden nur Memory Pools ausgegeben, an die eine Task der im nachfolgenden Operanden USERID angegebenen Benutzerkennung angeschlossen ist.
*BY-TASK
Es werden nur Memory Pools ausgegeben, an die die Task mit der im nachfolgenden Operanden TSN angegebenen TSN angeschlossen ist.
USERID=*OWN / '<name 1..8>' / <var: name 8..8> / (<reg: A(name 8..8)>)
Operand wird nur für INFO=*ALL ausgewertet.
Gibt für CONNECT=*BY-USER die Benutzerkennung der angeschlossenen Task an. Mit *OWN ist die Benutzerkennung des Aufrufers voreingestellt. Nur der privilegierte Benutzer kann sich Memory Pools anzeigen lassen, an die Tasks einer anderen Benutzerkennung angeschlossen sind.
'<name 1..8>'
Angabe der Benutzerkennung.
<var: name 8..8>
Symbolische Adresse (Name) des Feldes, das die Benutzerkennung enthält (nur für MF=M).
(<reg:A(name 8..8))
reg = Register, das die Adresse des Feldes mit der Benutzerkennung enthält (nur für MF=M).
TSN=*OWN / '<name 1..4>' / <var: name 4..4> / (<reg: A(name 4..4)>)
Gibt für CONNECT=*BY-TASK die TSN der angeschlossenen Task an. Mit *OWN ist die TSN des Aufrufers voreingestellt. Der nicht-privilegierte Benutzer kann hier nur Tasks der eigenen Benutzerkennung angeben.
'<name 1..4>'
Angabe der TSN.
<var: name 4..4>
Symbolische Adresse (Name) des Feldes, das die TSN enthält (nur für MF=M).
(<reg:A(name 4..4))
reg = Register, das die Adresse des Feldes mit der TSN enthält (nur für MF=M).
INFO=
Bestimmt den Umfang der auszugebenden Informationen.
*STD
Die Eigenschaften des Memory Pools und die Anzahl der angeschlossenen Tasks werden ausgegeben.
*ALL
Zusätzlich zur Standardausgabe werden alle angeschlossenen Tasks mit ihrer TSN aufgelistet. Für nicht-privilegierte Benutzer werden nur die TSNs der eigenen Benutzerkennung ausgegeben. Für privilegierte Benutzer werden alle TSNs ausgegeben.
NUMSHR=45 / <integer 1..4096> / <var: int:4> / (<reg: integer 1..4096>)Operand wird nur für INFO=*ALL ausgewertet.
Gibt an, wieviele Tasks maximal aufgelistet werden sollen.
<integer 1..4096>
Angabe der Anzahl der Tasks.
<var: int:4>
Symbolische Adresse (Name) des Feldes, das die Anzahl der Tasks enthält (nur für MF=M).
(<reg: integer 1..4096>)
reg = Register, das die Anzahl der Tasks enthält (nur für MF=M).
INFO_AREA=adr / (r)
Nur für MF=M.
Gibt die Adresse des Bereichs zur Informationsausgabe an. Der Bereich muss aus einer oder mehreren Klasse-6-Speicherseiten bestehen.
adr
Symbolische Adresse (Name) eines Hilfsfeldes, das die Adresse des Bereichs zur Informationsausgabe enthält.
(r)
r = Register mit dem Adresswert des Bereichs zur Informationsausgabe.
INFO_LENGTH=1 / <integer 1..1024> / <var: int:4> / (<reg: integer 1..1024>)
Angabe der Anzahl der Seiten für die Ausgabe.
<integer 1..1024>
Angabe der Anzahl der Seiten.
<var: int:4>
Symbolische Adresse (Name) des Feldes, das die Anzahl der Seiten enthält (nur für MF=M).
(<reg: integer 1..1024>)
reg = Register, das die Anzahl der Seiten enthält (nur für MF=M).
XPAND=
Steuerungs-Operand nur für MF=C und MF=D:
Es wird festgelegt, welche Struktur zu expandieren (erzeugen) ist. Angaben bei diesem Operanden werden bei anderen MF-Werten ignoriert.
PARAM
Das Layout der Parameterliste wird expandiert.
INFA
Das Layout des Informationsbereiches wird expandiert.
EQUATES=
Steuerungs-Operand nur für MF=C und MF=D:
Gibt an, ob bei der Expansion des Parameter- oder Informationsbereichs auch Equates für die Werte der Felder des Parameter- oder Informationsbereichs generiert werden sollen.
YES
Bei der Expansion des Parameter- oder Informationsbereichs werden auch Equates für die Werte der Felder des Parameter- oder Informationsbereichs generiert.
NO
Bei der Expansion des Parameter- oder Informationsbereichs werden keine Equates für die Werte der Felder des Parameter- oder Informationsbereichs generiert.
Programmierhinweise
Es gibt drei Paare von Operanden, die nicht zusammen verwendet werden dürfen und die sich gegenseitig ausschließen: MPNAME und MPNAMAD, GROUP_USERID und USER_GROUPID sowie USERID und TSN. Bei diesen Paaren gilt die Grundregel, dass die (in unterschiedlichen MF-Varianten) zuletzt gemachte Angabe maßgeblich ist und zu den restlichen Operanden passen muss.
Im Detail:
Werden MPNAME oder MPNAMAD angegeben, so gilt immer die letzte dieser Angaben (d.h. die vom letzten MF=L- oder MF=M-Aufruf).
Bei SCOPE=*GROUP muss zuletzt GROUP_USERID angegeben werden (nicht USER_GROUPID).
Bei SCOPE=*USER_GROUP muss zuletzt USER_GROUPID angegeben werden (nicht GROUP_USERID).
Bei SELECT=*PAR und CONNECT=*BY-USER muss zuletzt der Operand USERID angegeben werden (nicht TSN).
Bei SELECT=*PAR und CONNECT=*BY-TASK muss zuletzt der Operand TSN angegeben werden (nicht USERID).
Informationen über die Memory Pools werden im Informationsbereich (Operanden IN-FO_AREA und INFO_LENGTH) bereitgestellt. Daneben gibt es im Parameterbereich zwei weitere Felder mit Ausgabeinformationen:
Wenn die Funktion erfolgreich war oder teilweise ausgeführt wurde, dann wird die Anzahl Memory Pools, über die Informationen im Informationsbereich ausgegeben wurden, im Feld
&P.NPOL
bereitgestellt.Wenn die Größe des Klasse-6-Speichers (Operand INFO_LENGTH) nicht ausreicht (Return-Information: Funktion teilweise ausgeführt. Informationsbereich zu klein), dann wird die benötigte Seitenzahl im Parameterbereich (Feld
&P.INFX
) bereitgestellt. Sie kann für weitere Aufrufe von SHOWMP, z.B. in einer Laufschleife, verwendet werden.Die Anzahl der Memory Pools kann sich zwischen zwei Aufrufen von SHOWMP ändern!
Layout des Parameterbereichs
&P._MDL DSECT * subcode2 &P.NONE EQU 0 no further information &P.NOMP EQU 1 no memory pool found &P.NOCO EQU 2 no connection to memory pool &P.MNER EQU 3 error in MPNAME specification &P.MAER EQU 4 invalid MPNAMAD address &P.MLER EQU 5 invalid MPNAMLN value * specified &P.SCER EQU 6 error in SCOPE specification &P.SEER EQU 7 error in SELECT specification &P.PPER EQU 8 error in PRIV_POOL * specification &P.COER EQU 9 error in CONNECT * specification &P.GUER EQU 10 wrong USERID specified for * SCOPE=*GROUP &P.GRER EQU 11 wrong GROUPID specified for * SCOPE=*USER-GROUP &P.CUER EQU 12 wrong USERID specified for * CONNECT=*BY-USER &P.CTER EQU 13 wrong TSN specified for * CONNECT=*BY-TASK &P.IFER EQU 14 error in INFO specification &P.NSER EQU 15 error in NUMSHR specification &P.IAER EQU 16 invalid INFO_AREA address &P.ILER EQU 17 invalid INFO_LENGTH value * specified &P.FHDR FHDR MF=(C,&P.),EQUATES=NO Standardheader * main return codes &P.SUCC EQU 0 function processed * successfully &P.PART EQU 1 function processed only * partially &P.PAER EQU 2 parameter error &P.INER EQU 3 internal error &P.PRER EQU 4 privilege error &P.PSAT EQU 5 paging area saturation &P.MSAT EQU 6 main memory saturation &P.USAT EQU 7 user space saturation &P.SSAT EQU 8 system space saturation * &P.MPSS DS AL1 MPSHOW FLAG &P.MPNS EQU X'80' *ALL OR MP NAME SPECIFIED &P.CUSS EQU X'40' *OWN OR USERID SPECIFIED
&P.TSNS EQU X'20' *OWN OR TSN SPECIFIED &P.GUSS EQU X'10' *OWN/*ANY OR USERID SPECIFIED &P.GRPS EQU X'08' *OWN/*ANY OR GROUPID * SPECIFIED &P.GUOA EQU X'04' *ANY OR *OWN FOR USERID * SPECIFIED &P.GROA EQU X'02' *ANY or *OWN FOR GROUPID * SPECIFIED &P.RES1 EQU X'01' RESERVED * &P.COPE DS FL1 SCOPE OF SHOWMP * scope of memory pools &P.ANYS EQU 0 any memory pool scope &P.GRP EQU 1 memory pools of scope=group &P.UGRP EQU 2 memory pools of * scope=user-group &P.GLB EQU 3 memory pools of * scope=user-global * &P.SELE DS FL1 SELECTION OF SHOWMP * select memory pools &P.ALLS EQU 0 select all memory pool data &P.PAR EQU 1 select specific data * &P.CONM DS FL1 CONNECTION OF SHOWMP * select connected memory pools &P.ANYC EQU 0 select any memory pool &P.USER EQU 1 select memory pools of user * ID &P.TASK EQU 2 select memory pools of task * &P.PRPO DS FL1 PRIV-POOL OF SHOWMP * privilege of memory pools &P.ANYP EQU 0 select memory pools whether * privileged or no &P.YESP EQU 1 select only privileged memory * pools &P.NOP EQU 2 select only non-privileged * &P.INFM DS FL1 INFO OF SHOWMP * type of information &P.STD EQU 0 get data without TSN-list &P.ALLI EQU 1 get data with TSN-list * &P.MPNM DS CL54 MEMORY POOL NAME &P.MPNA DS A ADDRESS OF MEMORY POOL NAME &P.MPLN DS F LENGTH OF MPNAME &P.SCOPE_ID DS 0XL8 USER- OR GROUP_ID
&P.GUSI DS CL8 USER-ID BY SCOPE=GROUP ORG &P.SCOPE_ID &P.GRPI DS CL8 GROUP-ID BY SCOPE=USER-GROUP ORG &P.SCOPE_ID+8 &P.CONNECT_ID DS 0XL8 USER-ID OR TSN &P.USID DS CL8 USER-ID BY CONNECT=*BY-USER ORG &P.CONNECT_ID &P.TSN DS CL4 TSN BY CONNECT=*BY-TSN ORG &P.CONNECT_ID+8 &P.NRSH DS F # OF SHARER &P.INFP DS A ADDRESS OF INFO AREA &P.INFL DS F LENGTH OF INFO AREA IN PAGES &P.NPOL DS F NUMBER OF FOUND MEMORY POOLS &P.INFX DS F NEW LENGTH OF INFO AREA (PAGES) &P.# EQU *-&P.FHDR
Layout des Informationsbereichs
&P.INFA DSECT * * info area description &P.NXTM DS A NEXT MEMORY POOL &P.MPNA DS CL54 MEMORY POOL NAME &P.MPSC DS FL1 SCOPE OF MEMORY POOL * scope of memory pools &P.GRPO EQU 1 memory pools of scope=group &P.UGRO EQU 2 memory pools of * scope=user-group &P.GLBO EQU 3 memory pools of * scope=global * &P.RES DS XL1 RESERVED BYTE &P.GUID DS CL8 GROUP- OR USER-ID &P.NSHR DS F # OF SHARER TASKS &P.STSN DS CL4 TSN OF SHARER &P.INFA# EQU *-&P.NXTM
Rückinformation und Fehleranzeigen
Standardheader:
+---------------+ | | | | | |c|c|b|b|a|a|a|a| +---------------+
Über die Ausführung des Makros SHOWMP 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. |
X'01' | X'00' | X'0000' | Normale Ausführung. Kein passender Memory Pool im System |
X'02' | X'00' | X'0000' | Normale Ausführung. Spezifizierter Memory Pool vorhanden, aber nicht |
X'00' | X'00' | X'0001' | Funktion teilweise ausgeführt. Informationsbereich zu klein. Die nötige |
X'03' | X'01' | X'0002' | Fehler im Operanden MPNAME (auch wenn MPNAMAD auf ein Feld mit |
X'04' | X'01' | X'0002' | Ungültige Adresse im Operanden MPNAMAD |
X'05' | X'01' | X'0002' | Ungültiger Wert im Operanden MPNAMLN |
X'06' | X'01' | X'0002' | Fehler im Operanden SCOPE |
X'07' | X'01' | X'0002' | Fehler im Operanden SELECT |
X'08' | X'01' | X'0002' | Fehler im Operanden PRIV_POOL |
X'09' | X'01' | X'0002' | Fehler im Operanden CONNECT |
X'0A' | X'01' | X'0002' | Falsche Benutzerkennung im Operanden USERID (SCOPE=*GROUP) |
X'0B' | X'01' | X'0002' | Falsche Gruppenkennung im Operanden GROUPID (SCOPE=*USER- |
X'0C' | X'01' | X'0002' | Falsche Benutzerkennung im Operanden USERID (CONNECT=*BY- |
X'0D' | X'01' | X'0002' | Falsche TSN im Operanden TSN (CONNECT=*BY-TASK) |
X'0E' | X'01' | X'0002' | Fehler im Operanden INFO |
X'0F' | X'01' | X'0002' | Fehler im Operanden NUMSHR |
X'10' | X'01' | X'0002' | Ungültige Adresse im Operanden INFO_AREA (auch bei fehlender |
X'11' | X'01' | X'0002' | Ungültige Länge im Operanden INFO_LENGTH |
X'00' | X'20' | X'0003' | Interner Fehler |
X'00' | X'40' | X'0004' | Privileg für Aufruf nicht vorhanden |
X'00' | X'80' | X'0005' | Engpass im Seitenwechselspeicher |
X'00' | X'80' | X'0006' | Engpass im Hauptspeicher |
X'00' | X'80' | X'0007' | Engpass im Benutzeradressraum |
Weitere Returncodes, deren Bedeutung durch Konvention makro-übergreifend festgelegt ist, können der Tabelle „Standard-Returncodes“ (Standardheader) entnommen werden.
Programmbeispiel
SHOWMP MF=D,XPAND=PARAM SHOWMP MF=D,XPAND=INFA * SHMEMPO @ENTR TYP=I,LOCAL=SHMEMPL SHMEMPL @PAR D=YES SHMEMPC SHOWMP MF=C,PREFIX=A,XPAND=PARAM * SHMPNAME DS CL8 MPNAME SHUSERID DS CL8 USERID FOR GROUP SHMEMPL @PAR LED=YES ... LA R3,SHMEMPC USING NVPI_MDL,R3 LA R4,1 MVC SHMEMPC(NVPI#),SHMEMPD MVC SHMPNAME,MEMPNAME COPY MPNAME MVC SHUSERID,USERID Assume: MYUID is own USERID LA R9,SHMPNAME A(MPNAME) * SHOWMP MF=M,MPNAMAD=(R9),MPNAMLN=8,GROUP_USERID=SHUSERID * @CYCL , * REQM (R4) REQUEST CLASS 6 PAGES @WHEN NZ LTR R15,R15 @BREAK , * LR R5,R1 SHOWMP MF=M,INFO_AREA=(R5) * SHOWMP MF=E,PARAM=(R3) GET MEMORY POOL DATA XR R15,R15 @WHEN EQ CLC NVPIMRET,=X'0000' @OR GT CLC NVPIMRET,=X'0001' @BREAK , * RELM (R4),(R5) RELEASE CLASS 6 PAGES
* L R4,NVPIINFL GET NEW PAGE NUMBER @BEND , * @IF ZE LTR R15,R15 @AND EQ CLC NVPIMRET,=X'0000' @AND NE CLC NVPINPOL,=F'0' AVOID CYCLE WITH LOOP COUNT 0 @THEN , * * evaluation of returned info data * L R8,NVPINPOL LR R7,R5 ADDRESS OF INFO AREA USING NVPIINFA,R7 * @CYCL (R8) LOOP OVER FOUND MEMPOOLS . . L R7,NVPINXTM NEXT MEMORY POOL @BEND , * @ELSE , * * error handling * @BEND , ... @END , * DATA SHMEMPD SHOWMP MF=L,SCOPE=*GROUP,SELECT=*ALL,INFO=*ALL * MEMPNAME DC CL8'HAUS*' MPNAME WITH WILDCARD USERID DC CL8'MYUID' USERID FOR GROUP