David,

To my knowledge IBM does not provide a way as part of setting up cross memory services to serialize the termination of a LX owning address space with the program(s) that may be trying to the use LX/PC routines. The LX owning application has to design a methodology to deal with this. Unless of course you create your XMS structure in the master scheduler address space in which case your LX owning address space would NEVER terminate. You could do this by making your LX owning application a z/OS subsystem and using a subsystem initialization exit.

An approach you could have a switch (bit) available that can be tested by your assembler routine that would indicate whether you can issue the PC or not. If the bit is on you can issue the PC. If the bit is off then you must not issue the PC. This support would entail (at a very high level):

- Adding a bit that indicates if the LX is usable or not. Typically the LX owning address space has a global cb to anchor the LX it has obtained. Hopefully you can add the bit to the same global cb. - Change the LX owning address space to set the bit to indicate its "LX is usable" once it has initialized and is ready for its PC routines to be invoked. - When LX owning address space terminates (normally or abnormally) you turn off the bit. - Optionally change the LX owning address space to "wait a bit" prior to terminating (normally or abnormally) after turning the bit off. This would allow any "in-flight" pc routine(s) to complete. Length of time to wait depends upon the PC routine. - Optionally change the PC routine to check the bit periodically during processing. If bit gets turned off then quickly exit the PC routine. - Change the routines that issue the PC call to check the bit prior to issuing the PC. If bit is on then issue the PC call. If the bit is off the don't issue the PC.

Hope this helps.

Ray Overby


David Logan wrote:
Here is a question for the masses. I am calling a PC routine from C++. The
C++ and assembly code snippets are at the end.

My question is this: When the address space that contains the XMS routine
goes down, my client app crashes with a S0D6(rsn 22). All fine and dandy,
but I want this to not happen. I was hoping the try/catch block would catch
it, but it doesn't. Does anyone know what recovery routine options I have to
trap this and recover? What I want to do is wait for the XMS address space
to come back, then continue.

Thanks!

David Logan

The C++ code is:
try { rc=CallPC(data.lx_value, 1, handle, block_number, dest_buffer, data.data, workarea, &ecb, ascb); } catch(...) { printf("DANGER!\n"); rc = 0; };
The assembler code that is executed when CallPC is executed is:
CALLPCR CSECT CALLPCR AMODE 31 CALLPCR RMODE ANY EDCPRLG L 14,0(,1) L 14,0(,14) LXVALUE IN R1 (PC VALUE) LA 1,4(,1) POINT PARMLIST PAST LXVALUE PC 0(14) EDCEPIL
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [EMAIL PROTECTED] with the message: GET IBM-MAIN INFO
Search the archives at http://bama.ua.edu/archives/ibm-main.html


----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [EMAIL PROTECTED] with the message: GET IBM-MAIN INFO
Search the archives at http://bama.ua.edu/archives/ibm-main.html

Reply via email to