HP OpenVMS Systemsask the wizard |
The Question is:
I use sys$forcex to call the exit handler of a detached process, passing in a
status.
This works ok on a Vax, but on the Alpha the exit handler is called, but the
status is not as expected.
Forcex code
j_value = SS$_ABORT
j_status = sys$forcex ( , c_proc_str(1:i_len), %val(j_value) )
Exit Handler
PROGRAM TEST_EXIT
IMPLICIT NONE
EXTERNAL EXIT_HANDLER
STRUCTURE /EXIT_DESCRIPTOR/
INTEGER*4 J_LINK
INTEGER*4 J_ADDR
INTEGER*4 J_ARGS /0/
INTEGER*4 J_ANARG
END STRUCTURE
INTEGER*4 JC_DUMMY
RECORD /EXIT_DESCRIPTOR/ EXIT_DSCRPT
COMMON /EXITDS/ JC_DUMMY
! Declare exit handler
EXIT_DSCRPT.J_ADDR = %LOC(EXIT_HANDLER)
EXIT_DSCRPT.J_ANARG = %LOC(JC_DUMMY)
CALL SYS$DCLEXH(EXIT_DSCRPT)
CALL SYS$SETPRN('TEST_EXIT')
CALL LIB$WAIT(20000.0)
END
SUBROUTINE EXIT_HANDLER (j_status)
IMPLICIT NONE
INTEGER*4 J_STATUS
CALL EXIT (j_status)
END
Any idea?
The Answer is : That the exit handler is triggered would imply the call is arriving correctly in the process, but that the associated data structures or the associated exit handler routine is somehow invalid. On of the key requirements fo the exit handler storage is that it is declared outside the scope of any routine; that the storage is declared as a COMMON or as static storage. That appears to be the case here, but is common source of errors with this call. You can find a Fortran example of the sys$dclexh call in the Natural Language Search Assistance (AskQ) database, using a search string such as Fortran $dclexh call example? The support database also includes a number of other examples of other calls for other routines and other languages, as cited in the OpenVMS FAQ and elsewhere. In your case, the OpenVMS Wizard would also expect the argument count should be set to one (1), as you are passing the condition value to the exit handler routine; the exit handler has an argument. The description structure is a declaration of the exit handler argument list and related, and must match the exit handler calling sequence.
|