[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jan 2009
    Beiträge
    10

    Question RPG: zu viele offene Descriptoren ????

    Hallo liebe Leser...

    ich habe da ein mich belastendes Problem und hoffe, jemand erbarmt sich meiner...

    Kurzbeschreibung(alles ILE-RPG, V5R4):
    pgm A(actgrp=*new) ruft per Funktionsaufruf pgm B auf.
    pgm B(Actgrp=*caller) ruft per Funktionsaufruf mehrfach srvpgm C auf.
    srvpgm C(actgrp=*caller) erstellt eine pipe(API Qp0zPipe), holt sich eine Funktionsadresse aus einem anderen srvpgm D und führt diese Funktion dann aus. Die pipe dient zur Kommunikation zwischen pgm C und D.
    Ist D fertig, liest C die Antwort aus der pipe, schliest diese und wird beendet(return, *inlr=*off).
    Wenn nun A mehrfach aufgerufen wird, macht C irgendwann die Grätsche und sagt: zu viele offene Descriptoren für diesen Prozess !?!?!??!?!

    Es scheint also so, daß trotz des Schließens der pipe die beiden descriptoren immer noch im "Hintergrund" da sind.
    Wie werde ich die wieder los? Ist das wirklich das Problem? Ich hab schon 'ne kahle Stelle am Kopf...

    Hoffentlich kann da jemand helfen...

    Beispielcode kann ich natürlich liefern, ich müsste nur wissen, was genau benötigt wird.

    Siggi

  2. #2
    Registriert seit
    Jan 2003
    Beiträge
    746
    return, *inlr=*off verlässt nur ... *inlr=*on beendet.

  3. #3
    Registriert seit
    Jan 2009
    Beiträge
    10
    Hallo Robert,

    vielen Dank für deine Antwort. Der Unterschied ist mir bekannt...leider bleibt mir der Sinn Deiner Antwort unklar. Wahrscheinlich bin ich einfach mental blockiert Und bevor ich anfange zu interpretieren: vielleicht erlaubt es ja Deine Zeit nochmals ein wenig ausführlicher zu antworten, das wäre schön!

    mfG
    Siggi

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.875
    Ich weiss jetzt nicht in wieweit ich durch den folgenden Vorschlag in Euer Design eingreife.

    So wie es aussieht, werden mit jedem Aufruf der Prozedur aus Service-Program C statische Deskriptoren gebildet, die den Speicher blockieren und bei Beenden der Prozedur nicht freigeben.

    *INLR = *ON wird auch nicht helfen, da der Speicher in einer ILE-Umgebung dadurch nicht freigegeben, sondern reserviert bleibt bis die Aktivierungsgruppe, in der das Programm oder Service-Programm läuft beendet wird.

    Ich würde versuchen das Service-Programm C in einer benannten Aktivierungsgruppe (z.B. SrvPgm-Name = Aktivierungsgruppe) laufen lassen und nach jedem Aufruf diese Aktivierungsgruppe explizit mit dem CL-Befehl RCLACTGRP(SrvPgm) schließen. Dadruch müsste der Speicher freigegeben und die Deskriptoren wieder gelöscht werden. Wie sich das Ganze performancemäßig verhält bleibt auszuprobieren.

    Eine andere Frage, die sich stellt:
    Ist der Aufruf des APIs unbedigt erforderlich oder kann die Prozedur im 2.Service-Programm, die den Prozedur-Pointer zurückgibt nicht direkt aufgerufen werden?

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  5. #5
    Registriert seit
    Jan 2009
    Beiträge
    10
    Hallo Birgitta,

    auch Dir lieben Dank für Deine Antwort. Das srvpgm C war ursprünglich "nur" eine COPY-Strecke und wird auch als solche noch in manchen Programmen verwendet. Dort kommt es nicht zu diesem Problem. Leider kann ich aber, da wir auch gekaufte Software einsetzen, diese Copy-Strecke dort nicht nutzen...
    Da es sich bei srvpgm C um ein (das) zentrale Ermittlungsprogramm für die angeforderte Funktion handelt, möchte ich da auf gar keinen Fall (Performance) mit einer benannten actgrp usw. arbeiten.
    Es muß doch da noch einen anderen Weg geben!?

    mfG
    Siggi

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.245
    Bei einer Pipe werden ja 2 Descriptoren geöffnet!
    Bist du sicher, dass du auch beide schließt "close()-Funktion"?
    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
    Jan 2009
    Beiträge
    10
    ja, bin mir sicher, daß beide geschlossen werden...

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.245
    Soganz kann ich da was nicht nachvollziehen, aber:

    Das Programm D muss ja wohl irgendwie das Handle der Pipe noch übergeben bekommen, sonst kann ja auf der Empfangsseite nichts ankommen.

    Ich vermute daher mal, dass der Close nicht erfolgreich ist, da noch irgendeine Ressource belegt ist.

    Wie erfolgt denn der Close ?
    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
    Jan 2009
    Beiträge
    10
    Hallo zusammen...
    vielen Dank für die Hilfe.
    Ich habe es jetzt folgendermaßen gelöst: Alle Programm sind mit actgrp=*caller erstellt, alle werden nur mit return verlassen (*inlr=*off) und im srvpgm C erstelle ich die pipe nur, wenn sie nicht bereits vorhanden ist...
    So scheint es jetzt zu funktionieren...

    Siggi

Similar Threads

  1. Rückgabewert vom RPG Programm
    By mk in forum NEWSboard Java
    Antworten: 8
    Letzter Beitrag: 21-04-11, 21:51
  2. RPG: Client Infos lesen?
    By robertki in forum NEWSboard Programmierung
    Antworten: 25
    Letzter Beitrag: 19-01-07, 08:42
  3. Bibliotheksliste in RPG IV abfragen
    By timeless in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 11-01-07, 12:04
  4. Problem mit Java-Methoden Aufruf aus ILE RPG?
    By Stoeberl in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 10-01-07, 10:58
  5. RPG goes Web
    By jth in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 21-12-06, 11:13

Berechtigungen

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