-
Activation Group
Hallo,
ich habe ein Verständnisproblem bzgl. ACTGRPs. Wir haben ein Programm PGMA (*PGM) mit der ACTGRP = PGMA. Dieses ruft PGMB auf (*SRVPGM) mit der ACTGRP = PGMB. Wenn man wieder zu PGMA zurückkommt und dann RCLACTGRP PGMB durchführt und danach nochmal PGMB aufruft, kommt immer der Fehler
Es wurde versucht, auf ein nicht mehr vorhandenes Objekt oder Teile des Objekts Bezug zu nehmen.
Funktionsprüfung. MCH3402 nicht überwacht durch PGMB bei Anweisung *N,
Instruktion X'0000'.
Ich dachte, dass eine ACTGRP immer wieder neu angelegt wird, wenn sie nicht existiert. Durch den RCLACTGRP wurde sie doch wieder freigegeben und hätte wieder neu erstellt werden müssen. Oder sehe ich das falsch ? Wenn ich dann noch RCLACTGRP PGMA durchführe, dann funktioniert wieder alles ganz normal. Gibt es denn eine Verknüpfung dieser beiden ACTGRPs ?
Noch ein seltsamer Fall. Wenn ich nun das Serviceprogramm PGMB durch ein *PGM ersetze, dann wird nach Programmende von PGMB die ACTGRP wieder freigegeben, obwohl kein RCLACTGRP durchgeführt wurde. Ich dachte eigentlich, dass benannte ACTGRPs immer entweder durch Jobende oder durch RCLACTGRP beendet werden.
Gruß,
KM
-
Service-PGM'e haben normalerweise nur Funktionen und keine MAIN-Prozedur (dafür sind sie da) und laufen eigentlich unter der gleichen ACTGRP (*CALLER).
Eine ACTGRP wird automatisch beendet, wenn *INLR = ON ist, was nur bei MAIN-Prozeduren funktioniert.
Ein Service-PGM sollte (ich meine DARF) nicht per CALL sondern muss per CALLP aufgerufen werden. Dies erfordert ein Binderverzeichnis (CRTBNDDIR), das mit dem PGM, das den Service aufruft, mittels CRTPGM gebunden wird.
Service-Routinen sind wie lokale Prozeduren zu sehen.
Service-Programme sind eigentlich keine eigenständigen Programme und in der H-Bestimmung sollte am besten NOMAIN definiert werden.
-
Da geht wohl einiges durcheinander:
1. Eine Aktivierungs-Gruppe wird nicht durch den *INLR geschlossen, sondern nur inaktiviert, d.h. der Speicher bleibt reserviert und beim nächsten Aufruf werden nur die Variablen neu initialisiert. Ausnahme ist die Aktivierungs-Gruppe *NEW, sie wird beim Programm-Ende geschlossen.
Alle anderen Aktivierungs-Gruppen werden mit Job-Ende geschlossen. Benannte Aktivierungs-Gruppen können ausserdem mit dem CL-Command RCLACTGRP oder einem C-API geschlossen werden.
2. Eine (Sub-)Prozedur oder Funktion wird immer mit RETURN beendet und niemals mit *INLR. Grund: *INLR ist Zyklus und nur Main-Procedures unterliegen dem Zyklus, nicht aber Sub-Prozeduren.
3. Ob ein Service-Programm mit Main-Prozedur mit CALL oder CALLP aufgerufen wird, hat keinen Einfluss auf die Aktivierungs-Gruppe. (Ich bin mir nicht einmal sicher, ob der CALL ohne P überhaupt funktionniert, da nur Programme dynamisch aufgerufen werden können).
3. Ein Binder-Verzeichnis hat mit einem Aufruf überhaupt nichts zu tun, sondern wird zur Compile-Zeit benötigt, um entweder die verwendeten Module oder die Signatur der eingebundenen Service-Programme zu finden und in das Programm-Objekt einzubinden.
(Man kann auch die Module und Service-Programme direkt beim CRTPGM anlisten)
4. Es macht auch durch aus Sinn Service-Programme in einer benannten Aktivierungs-Gruppe laufen zu lassen, nämlich dann, wenn diese Prozeduren in fast jedem Programm verwendet werden, z.B. Aufbereiten von numerischen Datumswerten.
Man sollte nur die Aktivierungs-Gruppe dann nicht schliessen.
Dies führt zu dem Problem von KM:
Ein Service-Program wird statisch (über Signatur) in ein Programm eingebunden, und beim ersten Programm-Aufruf (also PGMA) aktiviert. Wird das Service-Programm mehrfach aufgerufen, erfolgt keine neue Aktivierung. Wird also die Aktivierungs-Gruppe, in der das Service-Programm läuft, gelöscht. Läuft der nächste Aufuf in Leere (MCH3402 oder was auch immer).
Anders sieht es bei Programmen aus. Der Aufruf ist dynamisch, d.h. jedes Mal wenn das Programm aufgerufen wird läuft der Aktivierungs-Prozess. Ist die Aktivierungs-Gruppe bereits aktiv, werden nur die Variablen neu initialisiert. Ist die Aktivierungs-Gruppe nicht aktiv, wird sie aktiviert.
Birgitta
-
boh ej
Hallo All,
ich quäle mich auch gerade seit ein paar Stunden durchs Handbuch : ILE-Concepts...
Habe gerade beschlossen mal ne Gedankenpause zu machen, weil es doch recht lustig wurde und die Begriffe wie BNDDIR und ACTGRP nur so um mich rumschwirren... und was sehe ich hier? Vom Regen in die Traufe ...
Schön zu lesen, dass ich nicht der einzige bin... :-))
Aber das wird schon werden...
Gruss an Alle
kuempi
-
@Birgitta:
Serviceprogramme werden garnicht aufgerufen. Was aufgerufen wird, sind Procedures (die in SRVPGMs enthalten sein können) und das geht nur mit CALLB oder CALLP (das beim Compile über den EXTPROC Eintrag im Prototyp in ein CALLB umgesetzt wird).
Neben SRVPGMs, die man nie mit reclaim bearbeiten braucht, gibt es noch die Variante mit eigener Activation Group beim SRVPGM, wenn man eine eigene Commit Scope haben will.
Bei Activation Group *CALLER eines SRVPGMS kann es durchaus zu Mehrfach Aktivierungen kommen, wenn Procedures des SRVPGMs aus Programmen oder anderen Service Programmen referenziert werden, die in unterschiedlichen Aktivierungsgruppen laufen.
Dieter
 Zitat von B.Hauser
Da geht wohl einiges durcheinander:
3. Ob ein Service-Programm mit Main-Prozedur mit CALL oder CALLP aufgerufen wird, hat keinen Einfluss auf die Aktivierungs-Gruppe. (Ich bin mir nicht einmal sicher, ob der CALL ohne P überhaupt funktionniert, da nur Programme dynamisch aufgerufen werden können).
4. Es macht auch durch aus Sinn Service-Programme in einer benannten Aktivierungs-Gruppe laufen zu lassen, nämlich dann, wenn diese Prozeduren in fast jedem Programm verwendet werden, z.B. Aufbereiten von numerischen Datumswerten.
Ein Service-Program wird statisch (über Signatur) in ein Programm eingebunden, und beim ersten Programm-Aufruf (also PGMA) aktiviert. Wird das Service-Programm mehrfach aufgerufen, erfolgt keine neue Aktivierung. Wird also die Aktivierungs-Gruppe, in der das Birgitta
-
Vielen Dank für die ausführlichen Erklärungen !
KM
-
ACTGRP
Gibt es eine Möglichkeit eine Aktivierungsgruppe in einem Job so zu beenden, dass sie nachher im selben Job wieder verwendet werden kann? Wie ich festgestellt habe ist das mit RCLACTGRP nicht möglich.
-
Normalerweise wird die ACTGRP wieder initialisiert sobald das 1. Programm dieser ACTGRP aufgerufen wird.
Das betrifft allerdings keine Zeiger von Prozeduren, deren ACTGRP bestehen bleibt.
Man sollte dann den gesamten Kontext (ab. 1. Aufrufebene) beenden.
-
Hallo,
auch hier ist wieder Präzision gefragt.
Aktiviert wird vom System nur beim dynamischen Call und dann neben der Activation Group des aufgerufenen Programms, alles was hinten dran noch gebunden wird; dabei können auch weitere Activierungsgruppen erzeugt werden (bei Bedarf) und auch Module in bestehenden Aktivierungsgruppen geladen werden.
Der RCLACTGRP haut eine ganze Aktivierungsgruppe raus, so dass dann Verweise auf aktivierte Procedures verloren gehen können.
Besser steuerbar wird das, wenn man die Aktivierung selber in die Hand nimmt, indem man für die CALLP Anweisungen Prototypen mit Procedure Pointern deklariert und dann beim ersten Aufruf (oder wann immer man will) per API Call aktiviert; damit fallen wesentliche Einschränkungen des automatischen aktivierens weg und man kann nach RCLACTGRP bei Bedarf erneut aktivieren.
Hierfür gibt es ein Service Programm auf meiner Open Source Seite. Ein positiver Nebeneffekt dieser Technik ist, dass die Ladezeiten deutlich optimiert werden, da nur bei Bedarf aktiviert wird.
mfg
Dieter Bender
 Zitat von ROT
Gibt es eine Möglichkeit eine Aktivierungsgruppe in einem Job so zu beenden, dass sie nachher im selben Job wieder verwendet werden kann? Wie ich festgestellt habe ist das mit RCLACTGRP nicht möglich.
-
Wobei man den CALLP wohl mit Monitor dann überwachen muss, FALLS der Call nämlich fehlschlägt (wegen RCLACTGRP) um dann die Aktivierung zu wiederholen.
-
Das ist eine der Möglichkeiten, das könnte aber auch ein Error Handler übernehmen, oder eine Initialisierungs Routine, die nach dem RCLACTGRP cascadierend aufgerufen wird und den Zustand der Module zurücksetzt und bei erneuter Verwendung wieder zum binden führt.
 Zitat von Fuerchau
Wobei man den CALLP wohl mit Monitor dann überwachen muss, FALLS der Call nämlich fehlschlägt (wegen RCLACTGRP) um dann die Aktivierung zu wiederholen.
-
Hallo KM,
 Zitat von KM
Hallo,
ich habe ein Verständnisproblem bzgl. ACTGRPs. Wir haben ein Programm PGMA (*PGM) mit der ACTGRP = PGMA. Dieses ruft PGMB auf (*SRVPGM) mit der ACTGRP = PGMB. Wenn man wieder zu PGMA zurückkommt und dann RCLACTGRP PGMB durchführt und danach nochmal PGMB aufruft, kommt immer der Fehler
Es wurde versucht, auf ein nicht mehr vorhandenes Objekt oder Teile des Objekts Bezug zu nehmen.
Funktionsprüfung. MCH3402 nicht überwacht durch PGMB bei Anweisung *N,
Instruktion X'0000'.
Ich dachte, dass eine ACTGRP immer wieder neu angelegt wird, wenn sie nicht existiert. Durch den RCLACTGRP wurde sie doch wieder freigegeben und hätte wieder neu erstellt werden müssen. Oder sehe ich das falsch ? Wenn ich dann noch RCLACTGRP PGMA durchführe, dann funktioniert wieder alles ganz normal. Gibt es denn eine Verknüpfung dieser beiden ACTGRPs ?
KM
Hier muss man die Erstellung einer Activation Group (= Ablaufkontext eines Programms) und die Aktivierung eines Programmes auseinanderhalten.
Programme werden inklusive aller gebundenen Bestandteile, auch der Service Programme beim ersten Aufruf komplett geladen und alle Referenzen auf Module in Service Programmen werden aufgelöst und an Procedure Pointer zugewiesen. Soweit bei diesem Vorgang Activation Groups nicht vorhanden sind, werden sie neu erstellt.
Dein RCLACTGRP PGMB schmeißt das SRVPGM aus dem Speicher, tangiert aber die Aktivierung von PGMA nicht, sodass die Procedure Pointer, die auf Module aus dem Service Programm verwiesen haben, ins Nirvana zeigen.
Nach dem RCLACTGRP auf PGMA wird PGMA aus dem Speicher entfernt und bei erneutem Aufruf inklusive des gebuindenen Service Programmes neu aktiviert und damit gibt es auch wieder gültige Procedure Pointer.
 Zitat von KM
Noch ein seltsamer Fall. Wenn ich nun das Serviceprogramm PGMB durch ein *PGM ersetze, dann wird nach Programmende von PGMB die ACTGRP wieder freigegeben, obwohl kein RCLACTGRP durchgeführt wurde. Ich dachte eigentlich, dass benannte ACTGRPs immer entweder durch Jobende oder durch RCLACTGRP beendet werden.
Gruß,
KM
Hier handelt es sich um eine falsche Beobachtung. Lediglich ACTGRP(*NEW) wird automatisch gelöscht.
Diese ganzen Schmutzeffekte sind vermeidbar durch dynamisches Binden zur aufzeit, sprich durch Aktivierung und Zuweisung der Procedure Pointer durch API Aufruf. (siehe auch PROCP4NAME auf meiner Open Source Seite).
mfg
Dieter Bender
@Baldur Mit *INLR hat das alles nix zu tun und es ist durchaus möglich (u.U. sogar sinnvoll) Module in einem ServiceProgram zu haben, das auch gleichzeitig Programm ist.
Similar Threads
-
By ChrisX in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 11-10-06, 15:31
-
By linguin in forum IBM i Hauptforum
Antworten: 6
Letzter Beitrag: 04-08-06, 10:38
-
By loeweadolf in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 21-12-05, 19:02
-
By CMueller@must.de in forum NEWSboard Java
Antworten: 1
Letzter Beitrag: 01-10-04, 09:29
-
By zerofive in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 14-09-04, 07:42
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks