|
HP OpenVMS systems documentation |
Previous | Contents | Index |
Any condition value returned by the user-formatted output action routine or LIB$PUT_OUTPUT.
#1 |
---|
#include <lib$routines.h> main() { __int64 zone_id = 0; __int64 detail_level = 1; LIB$SHOW_VM_ZONE_64(&zone_id, &detail_level); } |
An example of the output generated by this C program using detail-level 1 is as follows:
Zone Id = 0000000000020040, Zone name = "DEFAULT_ZONE" Algorithm = LIB$K_VM_FIRST_FIT Flags = 00000020 LIB$M_VM_EXTEND_AREA Initial size = 124 pages Current size = 0 pages in 0 areas Extend size = 128 pages Page limit = None Requests are rounded up to a multiple of 16 bytes, naturally aligned on 16 byte boundaries 0 bytes have been freed and not yet reallocated 128 bytes are used for zone and area control blocks, or 100.0% overhead
#2 |
---|
#include <descrip.h> #include <libvmdef.h> #include <lib$routines.h> #include <stdlib.h> #pragma pointer_size(long) main() { __int64 zone_id; __int64 algorithm = LIB$K_VM_QUICK_FIT; __int64 algorithm_arg = 16; __int64 flags = LIB$M_VM_FREE_FILL0 | LIB$M_VM_EXTEND_AREA; __int64 detail_level = 3; $DESCRIPTOR(zone_name, "Lookaside list and area blocks"); int i; #define NUM_BLOCKS 250 char *blocks[NUM_BLOCKS]; __int64 sizes[NUM_BLOCKS]; LIB$CREATE_VM_ZONE_64(&zone_id, &algorithm, &algorithm_arg, &flags, 0, 0, 0, 0, 0, 0, /* Omitted arguments */ &zone_name, 0, 0); for (i = 0; i < NUM_BLOCKS; i++) { sizes[i] = rand() % 400 + 17; LIB$GET_VM_64(&sizes[i], &blocks[i], &zone_id); } for (i = 0; i < NUM_BLOCKS; i++) LIB$FREE_VM_64(&sizes[i], &blocks[i], &zone_id); LIB$SHOW_VM_ZONE_64(&zone_id, &detail_level); } |
An example of the output generated by this C program using detail-level 3 is as follows:
Zone Id = 00000001C0002000, Zone name = "Lookaside list and area blocks" Algorithm = LIB$K_VM_QUICK_FIT with 16 Lookaside Lists ranging from a minimum blocksize of 16, to a maximum blocksize of 256 Flags = 00000028 LIB$M_VM_FREE_FILL0 LIB$M_VM_EXTEND_AREA Initial size = 16 pages Current size = 112 pages in 1 area Extend size = 16 pages Page limit = None Requests are rounded up to a multiple of 16 bytes, naturally aligned on 16 byte boundaries 56992 bytes have been freed and not yet reallocated 576 bytes are used for zone and area control blocks, or 0.9% overhead Quick Fit Lookaside List Summary: List Block Number of number size blocks ------ ---------- ---------- 2 32 6 3 48 7 4 64 7 5 80 14 6 96 6 7 112 12 8 128 14 9 144 14 10 160 7 11 176 14 12 192 8 13 208 9 14 224 8 15 240 12 16 256 10 Area Summary: First Last Pages Bytes not yet address address assigned allocated -------- -------- ---------- ------------- 00000001C0004000 00000001C0011FFF 112 352 Scanning Lookaside Lists in Zone Control Block Scanning Free List for Area at 00000001C0004000 Number of blocks = 63, Min blocksize = 272, Max blocksize = 1360
The Signal Exception Condition routine generates a signal that indicates that an exception condition has occurred in your program. If a condition handler does not take corrective action and the condition is severe, then your program will exit.
LIB$SIGNAL condition-value [,condition-argument...] [,condition-value-n [,condition-argument-n...]...]
None.
condition-value
OpenVMS usage: cond_value type: longword (unsigned) access: read only mechanism: by value
OpenVMS 32-bit condition value. The condition-value argument is an unsigned longword that contains this condition value.The HP OpenVMS Programming Concepts Manual explains the format of an OpenVMS condition value.
condition-argument
OpenVMS usage: varying_arg type: unspecified access: read only mechanism: by value
As many arguments as are required to process the exception specified by condition-value. Note that these arguments are also used as FAO (formatted ASCII output) arguments to format a message.The HP OpenVMS Programming Concepts Manual explains the message format.
condition-value-n
OpenVMS usage: cond_value type: longword (unsigned) access: read only mechanism: by value
OpenVMS 32-bit condition value. The optional condition-value-n argument is an unsigned longword that contains this condition value. The calling routine can specify additional conditions to be processed by specifying condition-value-2 through condition-value-n, with each condition value followed by any arguments required to process the condition specified. However, the total number of arguments in the call to LIB$SIGNAL must not exceed 253.The HP OpenVMS Programming Concepts Manual explains the format of an OpenVMS condition value.
condition-argument-n
OpenVMS usage: varying_arg type: unspecified access: read only mechanism: by value
As many arguments as are required to create the message reporting the exception specified by condition-value-n.The HP OpenVMS Programming Concepts Manual explains the message format.
A routine calls LIB$SIGNAL to indicate an exception condition or output a message rather than return a status code to its caller.LIB$SIGNAL creates a signal argument vector that contains all the arguments passed to it, with the PC and PSL (VAX) or PS (Alpha or I64) appended to it. LIB$SIGNAL also creates a mechanism argument vector that contains the state of the process at the time of the exception. LIB$SIGNAL then searches for a condition handler to process the exception condition.
LIB$SIGNAL first examines the primary and secondary exception vectors, then scans the stack, beginning with the most recent frame, searching for declared condition handlers. LIB$SIGNAL calls, in succession, each condition handler it finds, until a condition handler
- Returns a continue code
- Calls system service $UNWIND
- Calls LIB$STOP
LIB$SIGNAL uses each frame's saved frame pointer (FP) to chain back through the stack frames. The HP OpenVMS Programming Concepts Manual provides additional information on this process.
The condition handler can do one of the following:
- Sucessfully process the condition and return a continue code (that is, any success completion code with bit 0 set to 1). In this case, LIB$SIGNAL returns to its caller, which should be prepared to continue execution.
- Fail to process the condition. The handler then returns a resignal code (that is, any completion code with bit 0 set to 0) and LIB$SIGNAL scans the stack for the next specified handler.
- Dismiss the signal and system service $UNWIND to cause the Condition Handling Facility (CHF) to perform some call stack cleanup and resume program execution (at a level specified by the condition handler) up on the call stack.
LIB$SIGNAL can, as necessary, scan up to 65,536 previous stack frames and then finally examine the last-chance exception vector. If called, the last-chance exception handler formats a message based on the condition codes and arguments contained within the signal argument vector.
None.
#1 |
---|
C+ C This Fortran example program demonstrates the use of C LIB$SIGNAL. C C This program defines SS$... signals and then calls LIB$SIGNAL C passing the access violation code as the argument. C- INCLUDE '($SSDEF)' CALL LIB$SIGNAL ( %VAL(SS$_ACCVIO) ) END |
In Fortran, this code fragment signals the standard system message ACCESS VIOLATION.
The output generated by this Fortran program on an OpenVMS Alpha system is as follows:
%SYSTEM-F-ACCVIO, access violation, reason mask=10, virtual address=03C00020,_ PC=00000000, PS=08000000 %TRACE-F-TRACEBACK, symbolic stack dump follows module name routine name line rel PC abs PC D2$MAIN D2$MAIN 683 00000010 00000410
#2 |
---|
;+ ; This VAX MACRO example program demonstrates the use of LIB$SIGNAL ; by forcing an access violation to be signaled. ;- .EXTRN SS$_ACCVIO ; Declare external symbol .ENTRY START,0 PUSHL #SS$_ACCVIO ; Condition value symbol ; for access violation CALLS #1, G^LIB$SIGNAL ; Signal the condition RET .END START .EXTRN SS$_ACCVIO ; Declare external symbol PUSHL #SS$_ACCVIO ; Condition value symbol ; for access violation CALLS #1, LIB$SIGNAL ; Signal the condition |
This example shows the equivalent VAX MACRO code. The output generated by this program on a OpenVMS VAX system is as follows:
%SYSTEM-F-ACCVIO, access violation, reason mask=0F, virtual address=03C00000,_ PC=00000000, PSL=00000000 %TRACE-F-TRACEBACK, symbolic stack dump follows module name routine name line rel PC abs PC .MAIN. START 0000000F 0000020F
#3 |
---|
#include <ssdef.h> #include <lib$routines.h> main() { /* ** lib$signal will append the PC/PS to argument list, ** so pass only first two FAO arguments to lib$signal */ lib$signal(SS$_ACCVIO, 4, -559038737); /* Shouldn't return */ return (SS$_NORMAL); /* Exit if it does */ } |
This example shows the equivalent C code. The output generated by this program on an OpenVMS Alpha system is as follows:
%SYSTEM-F-ACCVIO, access violation, reason mask=04, virtual address=DEADBEEF, PC=00020034, PS=0000001B %TRACE-F-TRACEBACK, symbolic stack dump follows Image Name Module Name Routine Name Line Number rel PC abs PC LIB$SIGNAL 0 00010034 00020034 LIB$SIGNAL 0 000100A0 000200A0 0 82F01158 82F01158 0 7FF190D0 7FF190D0
#4 |
---|
#include <stdio> #include <ssdef> #include <tlib$routines> /* Condition handler: */ /* */ /* This condition handler will print out the signal array, based on */ /* the argument count in the first element of the array. The error */ /* is resignalled and should be picked up by the last chance condition */ /* handler which will format and print error messages and terminate the */ /* program. */ /* */ int handler (int* sig, int*mech) { int i; printf ("*** Caught signal:\n\n"); for (i = 0; i <= sig[0]; i++) { printf (" %08X\n", sig[i]); } printf ("\n"); return SS$_RESIGNAL; } /* Main program: */ /* */ /* Signal errors: */ /* */ /* SS$_BADPARAM has no arguments */ /* SS$_ACCVIO has 4 arguments, the last two (PC and PS) are */ /* automatically provided by LIB$SIGNAL. */ /* */ main () { lib$establish (handler); lib$signal (SS$_BADPARAM, SS$_ACCVIO, 2, 0xFACE); } |
This C example demonstrates the use of a condition handler to capture the signal generated by LIB$SIGNAL. The output is as follows:
$ CC SIGNAL.C $ LINK SIGNAL $ RUN SIGNAL *** Caught signal: 00000006 00000014 0000000C 00000002 0000FACE 000201A0 0000001B %SYSTEM-F-BADPARAM, bad parameter value -SYSTEM-F-ACCVIO, access violation, reason mask=02, virtual address=000000000000FACE, PC=00000000000201A0, PS=0000001B %TRACE-F-TRACEBACK, symbolic stack dump follows image module routine line rel PC abs PC SIGNAL SIGNAL main 5961 00000000000001A0 00000000000201A0 SIGNAL SIGNAL __main 0 0000000000000050 0000000000020050 0 FFFFFFFF82204914 FFFFFFFF82204914
The Signal Converted to a Return Status routine converts any signaled condition value to a value returned as a function. The signaled condition is returned to the caller of the user routine that established the handler that is calling LIB$SIG_TO_RET. This routine may be established as or called from a condition handler.
LIB$SIG_TO_RET signal-arguments ,mechanism-arguments
OpenVMS usage: cond_value type: longword (unsigned) access: write only mechanism: by value
signal-arguments
OpenVMS usage: vector_longword_unsigned type: unspecified access: read only mechanism: by reference, array reference
Signal argument vector. The signal-arguments argument contains the address of an array that is this signal argument vector stack.See the HP OpenVMS Programming Concepts Manual for a description of the signal argument vector.
mechanism-arguments
OpenVMS usage: structure type: unspecified access: read only mechanism: by reference
Mechanism arguments vector. The mechanism-arguments argument contains the address of a structure that is this mechanism argument vector stack.See the HP OpenVMS Programming Concepts Manual for a description of the mechanism argument vector.
LIB$SIG_TO_RET is called with the argument list that was passed to a condition handler by the OpenVMS Condition Handling Facility. The signaled condition is converted to a value returned to the routine that called the routine that established the handler. That action is performed by unwinding the stack to the caller of the establisher of the condition handler. The condition code is returned as the value in R0. See the HP OpenVMS Programming Concepts Manual for more information on condition handling.LIB$SIG_TO_RET causes the stack to be unwound to the caller of the routine that established the handler which was called by the signal.
SS$_NORMAL Routine successfully completed; SS$_UNWIND completed. Otherwise, the error code from SS$_UNWIND is returned.
C+ C This Fortran example demonstrates how to use LIB$SIG_TO_RET. C C This function subroutine inverts each entry in an array. That is, C a(i,j) becomes 1/a(i,j). The subroutine has been declared as an integer C function so that the status of the inversion may be returned. The status C should be success, unless one of the a(i,j) entries is zero. If one of C the a(i,j) = 0, then 1/a(i,j) is division by zero. This division by zero C does not cause a division by zero error, rather, the routine will return C signal a failure. C- INTEGER*4 FUNCTION FLIP(A,N) DIMENSION A(N,N) EXTERNAL LIB$SIG_TO_RET CALL LIB$ESTABLISH (LIB$SIG_TO_RET) FLIP = .TRUE. C+ C Flip each entry. C- DO 1 I = 1, N DO 1 J = 1, N 1 A(I,J) = 1.0/A(I,J) RETURN END C+ C This is the main code. C- INTEGER STATUS, FLIP REAL ARRAY_1(2,2),ARRAY_2(3,3) DATA ARRAY_1/1,2,3,4/,ARRAY_2/1,2,3,5,0,5,6,7,2/ CHARACTER*32 TEXT(2),STRING DATA TEXT(1)/' This array could be flipped. '/, 1 TEXT(2)/' This array could not be flipped.'/ STRING = TEXT(1) STATUS = FLIP(ARRAY_1,2) IF ( .NOT. STATUS) STRING = TEXT(2) TYPE '(a)', STRING STRING = TEXT(1) STATUS = FLIP(ARRAY_2,3) IF ( .NOT. STATUS) STRING = TEXT(2) TYPE '(a)', STRING END |
This Fortran example program inverts each entry in an array. The output generated by this program is as follows:
This array could be flipped. This array could not be flipped.
The Convert a Signaled Condition to a Signaled Stop routine converts a signaled condition to a signaled condition that cannot be continued.
LIB$SIG_TO_STOP signal-arguments ,mechanism-arguments
OpenVMS usage: cond_value type: longword (unsigned) access: write only mechanism: by value
signal-arguments
OpenVMS usage: vector_longword_unsigned type: unspecified access: modify mechanism: by reference, array reference
Signal argument vector. The signal-arguments argument contains the address of an array that is this signal argument vector stack.See the HP OpenVMS Programming Concepts Manual for a description of the signal argument vector.
mechanism-arguments
OpenVMS usage: structure type: unspecified access: read only mechanism: by reference
Mechanism argument vector. The mechanism-arguments argument contains the address of a structure that is this mechanism argument vector stack.See the HP OpenVMS Programming Concepts Manual for a description of the mechanism argument vector.
LIB$SIG_TO_STOP causes a signal to appear as though it had been signaled by a call to LIB$STOP. When a signal is generated by LIB$STOP, the severity code is forced to SEVERE and control cannot return to the routine that signaled the condition. LIB$SIG_TO_STOP may be enabled as a condition handler for a routine or it may be called from a condition handler.If the condition value in signal-arguments is SS$_UNWIND, then LIB$SIG_TO_STOP returns the error condition LIB$_INVARG.
SS$_NORMAL Routine successfully completed; SS$_UNWIND completed. Otherwise, the error code from SS$_UNWIND is returned. LIB$_INVARG Invalid argument. The condition code in signal-arguments is SS$_UNWIND.
Previous | Next | Contents | Index |