[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Hybrid View

  1. #1
    Registriert seit
    Feb 2013
    Beiträge
    51
    Im Helptext zu RCLRSC finde ich dazu folgendes:

    Example 5 (OPM)

    In this example, PROGA calls PROGB, which in turn calls PROGC.
    PROGC opens a file. Control returns to PROGA. PROGA calls PROGB a
    second time, and PROGB invokes RCLRSC. Since RCLRSC is based upon
    the position in the stack of the current invocation of a program,
    the file opened by PROGC is not affected. PROGC was invoked earlier
    than the current PROGB. In order for RCLRSC to close the file, the
    RCLRSC command will have to be invoked by PROGA.
    Dies beschreibt doch genau Dein Szenario, oder?
    Daher ist es wohl "works-as-designed".
    Gruss,
    Ernst

  2. #2
    Registriert seit
    Dec 2005
    Beiträge
    51
    Hallo Ernst,

    erst mal vielen Dank für die Antwort. Den Text kenne ich, genau das hatte ich gestern auf den IBM-Seiten gefunden.

    > Daher ist es wohl "works-as-designed".

    Zweifelsohne. Das Problem ist nur, dass ich das Design nicht vollständig verstehe. Und zwar bereitet mir genau das hier Kopfschmerzen:

    > is based upon the position in the stack
    > of the current invocation of a
    > program,


    Denn das klassische Paradigma eines Stacks ist doch 'last-in, first out'.

    Wenn also B auf den Stack gelegt wird, und dann C, dann wird in genau dieser Reihenfolge auch wieder abgeräumt: Wenn C zurückkehrt, liegt nur noch B auf den Stack. Kehrt B ebenfalls zurück, nämlich zu A, dann ist der Stack leer (abgesehen von 'A' selber natürlich),

    Rufe ich nun 'B' erneut auf, liegt es wieder genau da, wo es beim ersten Mal auch war: Als Erstes auf dem Stack. Alles also genau wie vorher.

    Worin besteht also der Unterschied zwischen dem Erst- und dem Zweitaufruf?

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.765
    In RPG kannst du die Anweisung FREE verwenden.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  4. #4
    Registriert seit
    Feb 2013
    Beiträge
    51
    Ich vermute das System "vergißt" den Aufruf von Pgm R2 wenn R1 beendet wird. Obwohl R1 ja weiterhin "aktiv" ist weil es ohne LR beendet worden ist.
    Aber die "current invocation" von R1 wurde beendet.

    Daher funktioniert ein RCLRSC beim zweiten Aufruf von R1 nicht weil in diesem zweiten Aufruf R2 noch nicht aufgerufen worden ist. Daher "weiß" das System (oder ignoriert es) nicht mehr, dass eigentlich R2 auch schon vorher von R1 aufgerufen worden ist.

    So klingt es für mich zumindest mit dem Helptext plausibel.

    Wenn Dich dies weiterhin stört hiflt wohl nur mehr ein Anruf beim IBM Helpdesk und eine Eröffnung eines PMR um dieses Problem näher zu analyisieren.
    Gruss,
    Ernst

  5. #5
    Registriert seit
    Dec 2005
    Beiträge
    51
    Wie ist den das mit der 'current invocation'. Ich glaube, wenn ich dazu etwas Genaueres finden könnte, käme ich ein Stück weiter.

    Mal heisst das in der Dokumentation 'current-invocation' dann finde ich 'run-level', dann wieder 'stack'. Da ich nun in Erinnerung habe, dass von RCLRSC alle 'höheren run-level' betroffen sind, scheint mir der Schlüssel zum Problem in diesem Wert zu liegen.

    hat jemand dazu vielleicht einen Hinweis oder Link?



    PS: Nur mal zur Erläuterung: Wir implementieren hier etwas, was die RCLRSC Funktionalität nachbilden soll, deshalb möchte ich es so genau wissen.

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.765
    RCLRSC nachbilden?
    Vergiss es, da gehört eigentlich ziemlich viel dazu.
    Ausserdem gibts ja auch noch den RCLACTGRP!
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #7
    Registriert seit
    Dec 2005
    Beiträge
    51
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Vergiss es
    Bei einem im achten Jahr laufenden Projekt ist das keine gute Option.

    Zitat Zitat von Fuerchau Beitrag anzeigen
    Ausserdem gibts ja auch noch den RCLACTGRP!
    Sie oben: Nur OPM.

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.765
    Wie Dieter nun sagen würde, Fehler im Design.

    Wenn du sicher sein willst, dass der folgende Aufruf eines OPM's immer mit *INZSR beginnt, verwende eben die "FREE"-Anweisung.
    Diese entfernt das Programm nach dem CALL.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.765
    Ich habe noch mal in die RPG-Handbücher geschaut. Die FREE-Anweisung ist da irgendwie verschwunden!

    Also:

    CALL 'MYPGM'
    FREE 'MYPGM'

    oder

    CALL VARPGM
    FREE VARPGM
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  10. #10
    Registriert seit
    Dec 2005
    Beiträge
    51
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Wie Dieter nun sagen würde, Fehler im Design.
    Inwiefern?

    Zitat Zitat von Fuerchau Beitrag anzeigen
    Wenn du sicher sein willst, dass der folgende Aufruf eines OPM's immer mit *INZSR beginnt, verwende eben die "FREE"-Anweisung.
    Das weiss ich ja. Aber dass das und wie das auf einer AS400 funktioniert ist ja nicht das Problem. Außerdem ist FREE nicht dasselbe wie RCLRSC, weil FREE (nach meiner Kenntnis) die Files nicht schließt.

    Aber vielleicht sollte ich mal ein bisschen aus dem Nähkästchen plaudern, weil sonst das Problem schlecht nachvollziehbar ist.

    Wie arbeiten an einer RPG und CL Konvertierung in C++. Der Kunde hat ca.30 Millionen Lines of Code in RPG, davon können wir aktuell knapp 90 Prozent umsetzen. Wichtig ist: Es geht hier (fast) ausschließlich um das OPM.

    Nun ist es eine der wesentlichen Eigenschaften von RPG (bzw. der AS400), dass Programme nach dem verlassen ihren Status behalten, sofern man nicht LR setzt. Das ist natürlich ein kolossal wichtiges Feature, welches wir auch sehr präzise unterstützen.

    Für eine korrekte CL-Umsetzung müssen wir nun natürlich genau verstehen, was RCLRSC tut. Es tut übrigens, weil das oben kurz erwähnt wurde, im Prinzip exakt das gleiche wie RCLACTGRP, nur das man eben im ILE die Activation Groups benennen kann, und im OPM immer die default Activation Group gilt. Somit ist ILE sehr viel flexibler, und weil das reine RCLRSC Konzept das nicht hergibt, hat man damals für die erweiterten ILE-Möglichkeiten eben RCLACTGRP geschaffen.

    Aber soviel nur am Rande, es ja um das OPM.

    Mit dieser Information ist es sicher einleuchtend, dass mir alternative Wege, die ich auf einer AS400 beschreiten könnte, nicht so viel nützen. Ich muss einfach nur verstehen, wie RCLRSC exakt funktioniert.

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.765
    Die Anweisung FREE gibt das aufgerufene Programm frei und schließt auch alle Dateien dieses Programmes.

    Hinter FREE und Return mit *INLR = *ON verbirgt sich die selbe MI-Anweisung zur Deaktivierung der Instanz, wobei im Programm selber ggf. noch Puffer von O-Dateien weggeschrieben werden.
    Free macht das nicht, sondern alle Ressourcen des Programmes werden freigegeben.
    Allerdings betrifft das nur diesen Aufruf, Ressourcen, die durch weitere Unterprogramme belegt wurden werden natürlich nicht freigegeben, hier hilft tatsächlich nur RCLRSC.

    Call-Stack und Aktivierung sind leider zwei verschiedene Dinge.
    Beim 1. Aufruf wird ein Programm aktiviert und bekommt intern halt eine Aktivierungs-ID.
    Danach erfolgt der Aufruf, so dass das Programm nun im Callstack steht und nach Return wieder verschwindet.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  12. #12
    Registriert seit
    Dec 2005
    Beiträge
    51
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Die Anweisung FREE gibt das aufgerufene Programm frei und schließt auch alle Dateien dieses Programmes.
    Aus dem RPG-Handbuch, FREE Opcode, IBM c0918170, Seite 259:

    "The FREE operation removes a program from the list of activated programs, frees static storage, and ensures program initialization (first cycle processing) the next
    time the program is called. It does not close files or unlock data areas.

Similar Threads

  1. CPYF in DDMF (im CLLE Batch Job) endet nicht
    By msost in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 09-04-13, 14:57
  2. *INLR vs. RCLRSC / Aktivierungsgruppen?
    By Stoeberl in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 19-05-05, 09:28

Tags for this Thread

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •