Subject: Re: Pass data in a MPF Exit across invocations Date: Wed, 14 Jun 2000 12:04:28 +0200 From: DE MULDER MIGUEL > Does anybody have a working example how to code this ? > [DE MULDER MIGUEL] Here is the fields for the data areas: BROWSE SYS1.MODGEN(IEZVX100) Line 00000300 Command ===> Scro CTXTCWKP DS A POINTER TO 12-BYTE COMMON DATA AREA FOR ALL EXITS CTXTIWKP DS A POINTER TO 8-BYTE DATA AREA FOR AN INDIVIDUAL EXIT Here is a sample: *********************************************************************** * * * STANDARD ENTRY LINKAGE * * * *********************************************************************** STM RE,RC,12(RD) SAVE CALLER'S REGISTERS LR RC,RF RC -> MODULE BASE USING IGF500D,RC RC IS BASE ADDRESS B ARNDVER MDMR2M0 DC C'[&PGMNAME' MDMR2M0 DC C' VER &PGMVER ' MDMR2M0 DC C' &SYSDATE &SYSTIME]' MDMR2M0 * MDMR2M0 ARNDVER DS 0H MDMR2M0 L RB,A_ROA RB *-> READ ONLY AREA MDMR2M0 USING ROA,RB ADDRESS R.O.A. WITH RB MDMR2M0 XR R9,R9 NO VRWA ALLOCATED YET MDMR2M0 L R8,0(R1) R8 -> CTXT USING CTXT,R8 ADDRESS CTXT WITH R8 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MDMR2M0 AIF ('&DEBUG' NE 'ON').DBG0010 MDMR2M0 WTO 'MPX500D MPF EXIT: ENTERED', MDMR2M0* MCSFLAG=(HRDCPY) MDMR2M0 .DBG0010 ANOP MDMR2M0 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MDMR2M0 CLC CTXTACRN,CTXTEYE IS IT A SYSTEM CALL ? MDMR2M0 BNE PRGMCALL N -> IT'S A PROGRAM CALL MDMR2M0 L R5,CTXTTXPJ R2 -> MESSAGE ATTRIBUTES AREA USING CTXTATTR,R5 ESTABLISH ADDRESSABILITY LA R6,CTXTTMSG R6 -> TEXT AREA USING MSGTXT,R6 ADDRESS MESSAGE TEXT WITH R6 L R7,CTXTIWKP R7 *-> 8 BYTES DATA MDMR2M0 USING USERCTXT,R7 ADDRESS PROVIDED BYTES MDMR2M0 * MDMR2M0 LA R4,4 HIGH COUNTER MDMR2M0 L R1,SER_CNT LOW COUNTER MDMR2M0 SER0 DS 0H MDMR2M0 LA R2,FREE VALUE EXPECTED MDMR2M0 LA R3,BUSY VALUE TO SET MDMR2M0 CS R2,R3,UCTXTLCK STORE R3 IF R2 = FREE MDMR2M0 BE SER0OK AND JUMP IF SUCCEED MDMR2M0 BCT R1,SER0 RETRY ONCE MORE MDMR2M0 WTO 'MPX500W MPF EXIT: MEMORY ALREADY LOCKED, REQUEST DELAYED', * MCSFLAG=(HRDCPY,BRDCST) MDMR2M0 L R1,SER_CNT RELOAD COUNTER MDMR2M0 BCT R4,SER0 RETRY ONCE MORE MDMR2M0 WTO 'MPX500E MPF EXIT: PERMANENT LOCK DETECTED, TERMINATING', * MCSFLAG=(HRDCPY,BRDCST) MDMR2M0 B QUICK_EXIT NO MORE ATTEMPT, EXIT MDMR2M0 * MDMR2M0 A_ROA DC A(ROA) *-> ROA MDMR2M0 * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = MDMR2M0 * = = = S H A R E D M E M O R Y N O W L O C K E D = = = = MDMR2M0 * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = MDMR2M0 SER0OK DS 0H MDMR2M0 L RA,UCTXTRWA GET *-> READ/WRITE AREA MDMR2M0 LA RE,QUICK_EXIT *-> TO EXIT POINT MDMR2M0 * MDMR2M0 CLC MIGF509D,MSGID MESSAGE IGF509D ? MDMR2M0 BE CHKDEAC Y -> JUMP AROUND MDMR2M0 CLC MIGF500D,MSGID MESSAGE IGF500D ? MDMR2M0 BNER RE NO -> EXIT IMMEDIATELY CLC MDUMMY,MSGBODY CONTENTS 'DUMMY' ? MDMR2M0 BE FCTCALL Y -> FUNCTION CALL MDMR2M0 CHKDEAC TM CTXTSFB4,CTXTCIDA DEACTIVATION CALL ? MDMR2M0 BZ REALCALL N -> TREAT REAL MESSAGE MDMR2M0 L RF,ENDCALL_E_P GET ENTRY POINT MDMR2M0 BR RF BRANCH FOR TERMINATION MDMR2M0 DROP R5,R6 DROP TXT + MSG ADDRESSABILITY EJECT * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = MDMR2M0 * MDMR2M0 * P R O G R A M C A L L MDMR2M0 * MDMR2M0 * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = MDMR2M0 *> MDMR2M0 *> NO CTXT WAS PROVIDED AT ENTRY MDMR2M0 *> MDMR2M0 PRGMCALL DS 0H MDMR2M0 ... * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = MDMR2M0 * MDMR2M0 * N O R M A L C A L L MDMR2M0 * MDMR2M0 * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = MDMR2M0 REALCALL DS 0H MDMR2M0 ... * * STANDARD EXIT LINKAGE, AND EXIT FROM THIS MODULE * THE_END DS 0H L RD,4(RD) RELOAD PREVIOUS S.A. *-> MDMR2M0 QUICK_EXIT DS 0H IF NO S.A. WAS PROVIDED MDMR2M0 LTR R9,R9 CHECK *-> VRWA MDMR2M0 BZ UNLOCK_M NULL -> NO RELEASE MDMR2M0 LA R0,L_VRWA R0 = LENGTH MDMR2M0 FREEMAIN RU, RELEASE STORAGE MDMR2M0X LV=(R0), R0 CONTAINS THE LENGTH MDMR2M0X A=(R9), R9 CONTAINS THE ADDRESS MDMR2M0X SP=SPINPRVT SUBPOOL NUMBER MDMR2M0 UNLOCK_M DS 0H NOW UNLOCK SHARED STRGE MDMR2M0 LTR R8,R8 CHECK *-> CTXT MDMR2M0 BZ PRGMC_EXIT NULL -> NO CTXT MDMR2M0 L R7,CTXTIWKP R7 *-> 8 BYTES DATA MDMR2M0 USING USERCTXT,R7 ADDRESS PROVIDED BYTES MDMR2M0 LA R1,FREE ENABLE OTHER EXECUTIONS MDMR2M0 ST R1,UCTXTLCK CLEAR LOCK MDMR2M0 DROP R7 MDMR2M0 * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = MDMR2M0 * = = S H A R E D M E M O R Y N O W U N L O C K E D = = = MDMR2M0 * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = MDMR2M0 PRGMC_EXIT DS 0H IF PROGRAM CALL MDMR2M0 LM RE,RC,12(RD) RESTORE CALLER'S REGISTERS BR RE RETURN TO CALLER [DE MULDER MIGUEL] N.B.: The above sample is used in two ways: 1) an MPF exit which is called when a specific message is issued 2) a program (see PRGMCALL) which generates a dummy message in order to force the call of the exit (to pass commands to the exit). Hope this can help Miguel