unloadOnExit

Die Eigenschaft 'unloadOnExit' gibt an, ob ein aufgerufenes Programm nach dessen Beendigung entladen werden soll. Gültige Werte sind YES oder NO.

Für die Eigenschaft 'unloadOnExit' gelten folgende Einschränkungen:
  • Verwenden Sie die Eigenschaft nur an den folgenden Stellen:
    • Mit exit program-Anweisungen innerhalb eines Programms, das den Stereotyp 'BasicProgram' oder 'TextUIProgram' aufweist.
    • Auf Programmebene bei Programmen, die den Stereotyp 'BasicProgram' oder 'TextUIProgram' aufweisen.

    Wenn Sie die Eigenschaft sowohl auf Programmebene als auch auf Anweisungsebene angeben, so hat die Anweisungsebene Vorrang (siehe 'Beispiel' in diesem Thema).

  • Die Eigenschaft wirkt sich nur auf aufgerufene Programme aus. EGL ignoriert die Eigenschaft, sofern Sie keinen lokalen Aufruf absetzen. Um als 'lokal' zu gelten, muss ein Aufruf alle folgenden Bedingungen erfüllen:
    • Sie generieren beide Programme in derselben Sprache.
    • Sie führen beide Programme auf demselben System aus.
    • Entweder geben Sie keinen Verbindungsoptionsabschnitt an oder die Eigenschaft 'type' des Elements 'callLink' ist auf 'localCall' gesetzt.

    Bei Java™-Generierung hat die Eigenschaft 'unloadOnExit' keinen Effekt, wenn die Eigenschaft 'linkType' des Elements 'callLink' auf LIBRARY gesetzt ist.

Wenn Sie die Eigenschaft 'unloadOnExit' auf NO setzen, wirkt sich dies wie folgt aus:
  • Das aufgerufene Programm verbleibt im Hauptspeicher.
  • Alle SQL-Ergebnismengen und vorbereiteten SQL-Anweisungen, die das Programm erstellt hat, bleiben geöffnet.
  • Wenn Sie das Programm erneut aufrufen, wird durch die Builddeskriptoroptionen 'initNonIODataOnCall' und 'initIORecordsOnCall' gesteuert, ob globale Daten im Programm reinitialisiert werden.
Wenn Sie die Eigenschaft 'unloadOnExit' auf YES setzen, wirkt sich dies wie folgt aus:
  • Der gesamte, für das Programm zugeordnete Hauptspeicher wird freigegeben.
  • Alle SQL-Ergebnismengen und vorbereiteten SQL-Anweisungen, die das Programm erstellt hat, werden geschlossen, sofern das Programm nicht in Java oder im Debugger ausgeführt wird und die Eigenschaft 'localSqlScope' mit der Einstellung NO aufweist.
  • Wenn Sie das Programm erneut aufrufen, erhalten Sie eine neue Kopie.

Durch das Entladen eines Programms werden andere, von diesem Programm aufgerufene Programme nicht automatisch ebenfalls entladen. Jedes Programm wird einzeln entladen oder beibehalten.

Beibehaltene Programme bleiben so lange erhalten, bis sie nach einem nachfolgenden Aufruf entladen werden oder bis die Ausführungseinheit endet. Die Ausführungseinheit wird durch die Anweisung 'transfer to transaction' beendet. Daher setzt diese Anweisung den Wert der Eigenschaft 'unloadOnExit' außer Kraft. Nach der Anweisung 'transfer to program' bleiben beibehaltene Programme weiterhin erhalten.

Die folgenden Elemente werden von allen Programmen in einer Ausführungseinheit gemeinsam genutzt und sind daher nicht betroffen, wenn ein aufgerufenes Programm entladen wird:
  • Dateien
  • Nachrichtenwarteschlangen
  • Datenbankverbindungen
  • Datentabellen
  • Bibliotheken

In DL/I-Programmen ist jeweils immer nur ein terminierter Programmspezifikationsblock (PSB) aktiv. Dieser PSB wird von beliebig vielen Programmen gemeinsam genutzt. Das Entladen eines aufgerufenen Programms hat keine Auswirkung auf den PSB. Er bleibt weiterhin terminiert.

Die Formulare, die ein Programm verwendet, gelten als globale Daten. Sie werden beibehalten, wenn ein aufgerufenes Programm beibehalten wird, und verworfen, wenn das betreffende Programm entladen wird.

Das Entladen impliziert keine Commit- oder Rollback-Operation.

Rekursive Programmaufrufe

COBOL unterstützt keine rekursiven Programmaufrufe.

Java unterstützt rekursive lokale Aufrufe, ausgenommen in Situationen wie der im folgenden Beispiel:
  1. Programm A ruft Programm B auf, direkt oder indirekt.
  2. Programm B kehrt zurück und wird beibehalten.
  3. Programm A ruft Programm B erneut auf.
  4. Programm B ruft sich selbst auf, direkt oder indirekt.

In diesem Beispiel führt die letzte Anweisung 'call' dazu, dass eine Ausnahmebedingung vom Typ 'InvocationException' ausgelöst wird. Daher gilt: Nachdem ein lokal aufgerufenes Java-Programm zurückkehrt und beibehalten wird, kann jeweils immer nur eine Kopie des Programms aktiv sein, wenngleich es zu einem späteren Zeitpunkt entladen werden kann.

Werte

Die Eigenschaft 'unloadOnExit' kann die folgenden Werte annehmen:
YES
Der gesamte Hauptspeicher für das Programm, einschließlich SQL-Ergebnismengen, wird freigegeben. Dieser Wert ist der Standardwert bei Java-Generierung. Beim Debugging setzen Sie die Benutzervorgabe 'Aufgerufene Programme geben nach Rückgabe standardmäßig Ressourcen frei'. Siehe Benutzervorgaben für den EGL-Debugger definieren.
NO
Das aufgerufene Programm wird im Hauptspeicher gehalten, zusammen mit den SQL-Ergebnismengen und allen anderen Variablen. Dieser Wert ist der Standardwert bei COBOL-Generierung.

Beispiel

Im folgenden Beispiel wird das Programm im Hauptspeicher beibehalten, nachdem es die Steuerung an das Programm zurückgibt, von dem es aufgerufen wurde, sofern kein nicht behebbar Fehler auftritt:

Program custProcess1 type basicProgram (custNum INT) {unloadOnExit = NO}

  ...

  if(myErrorCode == TERM_ERROR)
    exit program {unloadOnExit = YES};
  end
end