Ab BLSSERV V2.4A können mehrere oder alle Objekte einer Bibliothek mit einem einzigen Aufruf des BIND-Makros geladen werden. Dadurch entsteht eine so genannte List-Name-Unit und es werden mehrfache DBL-Aufrufe beim Laden einer Symbol-Liste derselben Ladeeinheit vermieden.
Zum Laden in eine List-Name-Unit sind die Angabe INTVERS=SRVxxx
(xxx >=
004) undSYMBOL=*ALL
oder SYMBOL=name
erforderlich, wobei das letzte Zeichen von name
das Wildcard-Symbol „*“ ist. Näheres siehe Makro BIND im Handbuch „Makroaufrufe an den Ablaufteil“ [7].
Das Laden in eine List-Name-Unit läuft folgendermaßen ab:
Abhängig vom Operanden SYMBOL wird eine Liste der aus der Hauptbibliothek zu ladenden Objekte erstellt:
Bei
SYMBOL=*ALL
wird zunächst die jeweils höchste Version aller Elemente des Typs L in diese Liste aufgenommen. Anschließend wird die jeweils höchste Version aller Elemente des Typs R in die Liste aufgenommen, jedoch nur dann, wenn nicht bereits ein gleichnamiges Element des Typs L in der Liste enthalten ist.Ist der Operand SYMBOL mit einem teilqualifizierten Name angegeben, so wird die Liste ebenso erzeugt. Allerdings werden dabei nur die Elemente berücksichtigt, die dem teilqualifizierten Namen entsprechen.
Die Namensliste enthält ausschließlich Namen von PLAM-Bibliothekselementen (d.h. SYMTYP=MODULE). Es werden keine gleichnamigen CSECTs oder ENTRYs in der Bibliothek gesucht.
Dabei gelten folgende Voraussetzungen:
Die Hauptbibliothek muss eine PLAM-Bibliothek sein.
Alternative Bibliotheken werden nur für den Autolink-Prozess verwendet, nicht jedoch bei der Erstellung der Namensliste.
LLM mit benutzerdefinierten Slices können nicht in eine List-Name-Unit geladen werden. Der Ladevorgangs wird mit RC=X'0C400430' abgebrochen.
Die Operanden VERS und VERS@ werden beim Laden in eine List-Name-Unit ignoriert.
Vor dem Laden findet keine Suche nach Namen im bereits geladenen Code statt, da es sich bei den Namen um Elementnamen und nicht um Symblonamen handelt. Im geladenen Code sind jedoch nur Symbolnamen hinterlegt.
Alle Objekte in der Liste werden in derselben Einheit (List-Name-Unit) und in dem Kontext geladen, der durch UNIT oder UNIT@ und LNKCTX oder LNKCTX@ festgelegt ist. Ist kein Name für die Ladeeinheit angegeben, wird der Name des ersten Objekts in der Liste als Name für die Ladeeinheit angenommen.
Die Version einer List-Name-Unit wird mit dem Operanden PGMVERS/PGMVERS@ bestimmt. Bei
PGMVERS=*STD
wird die PLAM-Version des ersten geladenen Objekts als Version der Ladeeinheit eingesetzt.In der DBL-Liste wird für jedes in der Liste enthaltene Objekt als Binde-Verfahren EXPLICIT angegeben.
Sowohl die zurückgelieferte Startadresse (Operand SYMBLAD bei BIND) als auch der zurückgemeldete AMODE entsprechen denen des ersten Objekts, das in die List-Name-Unit geladen wird. Ebenso wird bei Angabe von
BRANCH=YES
die Steuerung an die Startadresse des ersten Objekts übergeben, das in die List-Name-Unit geladen wurde.Beim Laden in eine List-Name-Unit werden Externverweise erst befriedigt, wenn alle Objekte der List-Name-Unit geladen sind. Auch die Autolink-Funktion wird erst zu diesem Zeitpunkt ausgeführt. Dadurch erhöht sich die Performance beim Befriedigen von Externverweisen: Ein Symbol, das in mehreren Modulen der Liste referenziert wird, muss nur einmal gesucht werden und nicht nach dem Laden jedes einzelnen Objekts.
Beispiel
Drei Objekte einer Liste sollen geladen werden:
Modul M1 mit Externverweisen E1 und E2
Modul M2 mit Externverweisen E2 und E3
Modul M3 mit ENTRY E1 und Externverweis E2.
Ladevorgang beim Laden ohne List-Name-Unit:
M1 laden
Externverweise E1 und E2 befriedigen und Autolink (E1 in M3 gefunden)
M3 laden (wegen Autolink)
Externverweis E2 befriedigen und Autolink (ohne Wirkung)
M2 laden
Externverweis E2 und E3 befriedigen und Autolink (ohne Wirkung).
Für den Externverweis E2 wird der Prozess der Adressbefriedigung dreimal durchlaufen.
Ladevorgang beim Laden in List-Name-Unit:
M1 laden
M2 laden
M3 laden
Externverweise E1, E2 und E3 und Autolink (ohne Wirkung)
Für den Externverweis E2 wird der Prozess der Adressbefriedigung nur einmal durchlaufen.
Das Laden in eine List-Name-Unit ist somit performanter, kann jedoch die Ladereihenfolge beeinflussen (Modul M3 wird ohne List-Name-Unit vor M2 geladen).
Bei Laden von PUBLIC/PRIVATE LLMs in List-Name-Units wird der Public-Teil erst geladen, nachdem alle Objekte der List-Name-Unit geladen sind.
Für das Entladen von List-Name-Units gelten folgende Einschränkungen:
Eine List-Name-Unit kann nur als Ganzes entladen werden. Das Entladen eines Teils oder nur eines einzelnen Moduls aus einer List-Name-Unit ist nicht möglich.
Falls bei einem der Objekte in der Liste Fehler auftreten, werden alle bereits geladenen Module der Liste (=aktueller Stand der List-Name-Unit) entladen. Dies entspricht dem derzeitigen Verhalten beim Laden einer Einheit.
Eigenschaften einer List-Name-Unit
Die Eigenschaften einer List-Name-Unit lassen sich wie folgt zusammenfassen:
Die Eingabeobjekte werden nur in der Hauptbibliothek gesucht (alternative Bibliotheken werden nur beim Autolink verwendet).
Eingabeobjekte werden grundsätzlich geladen (keine Suche im Speicher vor dem Laden).
Das Befriedigen von Externverweisen und die Durchführung der Autolink-Funktion erfolgen erst dann, wenn alle Objekte der List-Name-Unit geladen wurden.
Ein Modul einer List-Name-Unit kann nicht nicht unabhängig von der List-Name-Unit entladen werden.