![]() |
![]() HP OpenVMS Systemsask the wizard |
![]() |
The Question is: My DEC-BASIC program crashes on a MEMMANVIO. I'm creating a detached process and am communicating with it via an MBX, and it works fine as long as everything goes smoothly. However, I'm attempting to ensure the initiating process does not hang, having issued a QIOW/READVBLK to the MBX, if the detached process dies for some unexpected reason. Immediately before the QIOW I call SETIMR with an AST. But regardless of how I calcu late the time, delta or absolute, with the help of LIB$ routines or without, the AST triggers immediately. This occurrance rings vague bells in my memory, and setting the AST to do nothing on first invocation returns control to the main program and the QIOW executes. SETIMR, despite not being called again, then appears to trigger the AST after the correct time delay, but immediately crashes on the MEMMANVIO. This continues to be the case even if the AST executes only a single PRINT statement. Here's the output using debugger: DBG>go ast:: in ast routine <this is the print stmt> %BAS-F-MEMMANVIO, Memory management violation -BAS-I-USEPC_PSL, at user PC=8028DC40, PSL=0000001B -SYSTEM-F-ACCVIO, access violation, reason mask=00, virtual address=0000000000000008, PC=FFFFFFFF8028DC40, PS=0000001B -BAS-I-FROFUN, In external function FN_SPAWN -BAS-I-FROMOD, In module C2 break on unhandled exception preceding SHARE$LIBRTL_CODE0+395844 %DEBUG-I-SOURCESCOPE, Source lines not available for 0\%PC Displaying source for 9\%PC 12980: stat% = sys$qiow (0%, chan%, IO$_READVBLK, iosb,,, q_parms$(0%), -: q_buflen%,,,, ) DBG> This is the case whether the AST routine is internal or external, in the same .BAS source file or different. Any ideas? thanx The Answer is : Details of the compiler version and the source code may (will) be needed -- please contact the support center, as a start. The OpenVMS Wizard would likely use sys$qio and an AST completion routine for the mailbox operation, and not sys$qiow. The OpenVMS Wizard would further use a mailbox for each process and specifically a mailbox where exactly one process reads and where zero or more processes might write into it. Topics discussing various aspects of mailboxes include (1893), (5045), (5199), (6497), (6905), (7359), (8746) and others. The OpenVMS Wizard would generally avoid event flag zero, but would substitute EFN$C_ENF -- the Do Not Care event flag. Topics (7552) and (1661) may be of interest, and discuss debugging and common coding errors. Topic (9027) references the BASIC MEMMANVIO error, as well. The immediate problem appears to involve incorrect arguments to an RTL call, either a call made directly within the application or through an intermediate library or routine. This can also be caused by stack corruptions, buffer overruns, and similar. Again, please review topics including (1661) for detals. If you need to monitor a process for an exit, use of a lock is far more appropriate -- with a unique lock resource name and use of blocking and granting ASTs, an entirely servicable and fully distributed monitoring scheme can be implemented. Most commonly, a process holds an exclusive lock until it exists, and processes wishing to monitor its presence attempt to queue incompatible (and usually exclusive) locks. Should the incompatible lock be granted, the target process (or cluster node) has exited.
|