Annotation of gcl520h/_debug.h, revision 1.1.1.1

1.1       root        1: #ifndef __DEBUG_H
                      2: #define __DEBUG_H
                      3: 
                      4: /*
                      5:  * _DEBUG.H       5.20A  June 8, 1995
                      6:  *
                      7:  * The Greenleaf Comm Library
                      8:  *
                      9:  * Copyright (C) 1985-1995 Greenleaf Software Inc.  All Rights Reserved.
                     10:  *
                     11:  * NOTES
                     12:  *
                     13:  *  This header file contains prototypes and miscellaneous definitions
                     14:  *  for two different subsytems that are used to help diagnose
                     15:  *  problems under CommLib.
                     16:  *
                     17:  *  The first set of functions are those used to replace all of the
                     18:  *  heap memory functions.  When the _DEBUG macro is turned on, normal
                     19:  *  function calls to malloc(), calloc(), and free() are replaced with
                     20:  *  special versions.  The special versions track memory leaks and
                     21:  *  heap over- and under-writes, as well as the general problem of
                     22:  *  heap destruction.  Several other memory allocation functions get
                     23:  *  replaced here as well.
                     24:  *
                     25:  *  The second subsytem controlled here is the GF_ASSERT() macro.  This
                     26:  *  macro is nearly identical to the assert() macro used in the C RTL,
                     27:  *  but it includes an extra argument that allows you to print out the
                     28:  *  reason for an assertion failure.
                     29:  *
                     30:  * MODIFICATIONS
                     31:  *
                     32:  *  June 6, 1995  5.20A : It really wasn't very nice to modify malloc()
                     33:  *                        et. al. when _DEBUG is turned on.  This turns
                     34:  *                        out to cause people some trouble.  So now, I
                     35:  *                        just debug my *own* function calls when _DEBUG
                     36:  *                        is turned on. If a user wants to debug malloc()
                     37:  *                        and friends in their own libraries, they need
                     38:  *                        to define GF_ENABLE_HEAP_DEBUGGING.  The old
                     39:  *                        macro, GF_DISABLE_HEAP_DEBUGGING, is gone.
                     40:  *                        Regardless of the new macro's setting, I am
                     41:  *                        going to debug Greenleaf internal allocation if
                     42:  *                        _DEBUG is turned on.
                     43:  */
                     44: 
                     45: 
                     46: #ifdef __cplusplus
                     47: extern "C" {
                     48: #endif
                     49: 
                     50: /*
                     51:  * Heap checking will only get turned on if the _DEBUG macro is defined.
                     52:  * This is normally done using an option in BUILD.INI.  The function
                     53:  * shown below lets you test at runtime for the presence of the heap
                     54:  * debugging code.
                     55:  */
                     56: 
                     57: int GF_CONV _DebuggingHeap( void );
                     58: 
                     59: #ifdef __cplusplus
                     60: }
                     61: #endif
                     62: 
                     63: #if defined( _DEBUG )
                     64: /*
                     65:  * The heapcheck code uses specific function calls in the Borland and
                     66:  * Microsoft run time libraries.  It may work properly with other compilers,
                     67:  * but that hasn't been checked yet.
                     68:  */
                     69:   #if defined( GF_TURBO_CPP ) || defined( GF_BORLAND_CPP ) || defined( GF_MICROSOFT_C )
                     70: /*
                     71:  * We are not going to enable heap debugging if any of the DOS extenders
                     72:  * are turned on, or if Powercomm is enabled.
                     73:  */
                     74:     #if !defined( GF_X32 )
                     75:       #if !defined( GF_X16 )
                     76:         #if !defined( VGFD ) && !defined( VGFD_DLL )
                     77: /*
                     78:  * All we have to do at this point is decide whether we are running Windows
                     79:  * or not.
                     80:  */
                     81:           #if !defined( GF_WINDOWS )
                     82:             #define GF_HEAP_DEBUGGER
                     83:           #else  /* Small data, everything goes, large model, MSC only */
                     84:             #if !defined( GF_DLL ) && !defined( _WINDOWS_DLL )
                     85:               #if ( _LDATA == 0 )
                     86:                 #define GF_HEAP_DEBUGGER
                     87:               #elif defined( GF_MICROSOFT_C )
                     88:                 #define GF_HEAP_DEBUGGER
                     89:               #endif
                     90:             #endif /* !defined( GF_DLL ) && !defined( _WINDOWS_DLL ) */
                     91:           #endif
                     92:         #endif /* !defined( VGFD ) */
                     93:       #endif /* !defined( GF_X32 ) */
                     94:     #endif /* !defined( GF_X16 ) */
                     95:   #endif
                     96: #endif
                     97: 
                     98: #ifdef GF_HEAP_DEBUGGER
                     99: 
                    100: /*
                    101:  * This only applies to CommLib, but I guess it won't hurt anything to have
                    102:  * these definitions elsewhere.
                    103:  */
                    104: /*
                    105:  * Need to pick up the definition for size_t.
                    106:  */
                    107: #include <stdlib.h>
                    108: 
                    109: #define AllocateGreenleafPortStructure( port, size ) _DebugCalloc( 1, size, __FILE__, __LINE__ )  /* Tag: Debug Public */
                    110: #define FreeGreenleafPortStructure( port, p ) _DebugFree( p, __FILE__, __LINE__ )                 /* Tag: Debug Public */
                    111: #define AllocateDriverStructure( size ) _DebugCalloc( 1, size, __FILE__, __LINE__ )               /* Tag: Debug Public */
                    112: #define FreeDriverStructure( p ) _DebugFree( p, __FILE__, __LINE__ )                              /* Tag: Debug Public */
                    113: #define AllocateGenericStructure( size ) _DebugCalloc( 1, size, __FILE__, __LINE__ )              /* Tag: Debug Public */
                    114: #define FreeGenericStructure( p ) _DebugFree( p, __FILE__, __LINE__ )                             /* Tag: Debug Public */
                    115: #define AllocateTXBuffer( port, size ) _DebugCalloc( 1, size, __FILE__, __LINE__ )                /* Tag: Debug Public */
                    116: #define FreeTXBuffer( port, p ) _DebugFree( p, __FILE__, __LINE__ )                               /* Tag: Debug Public */
                    117: #define AllocateRXBuffer( port, size ) _DebugCalloc( 1, size, __FILE__, __LINE__ )                /* Tag: Debug Public */
                    118: #define FreeRXBuffer( port, p ) _DebugFree( p, __FILE__, __LINE__ )                               /* Tag: Debug Public */
                    119: #define AllocateXferBuffer( size ) _DebugCalloc( 1, size, __FILE__, __LINE__ )                    /* Tag: Debug Public */
                    120: #define FreeXferBuffer( p ) _DebugFree( p, __FILE__, __LINE__ )                                   /* Tag: Debug Public */
                    121: 
                    122: #ifdef __cplusplus
                    123: extern "C" {
                    124: #endif
                    125: 
                    126: typedef void ( * _FailureRoutine )( int terminate, char *fmt, ... );
                    127: void * GF_CONV _DebugMalloc( size_t size, char *file, long line );
                    128: void * GF_CONV _DebugCalloc( size_t nitems, size_t size, char *file, long line );
                    129: void GF_CONV _DebugFree( void *p, char *file, long line );
                    130: char * GF_CONV _DebugStrdup( const char *p, char *file, long line );
                    131: int GF_CONV _DebuggingHeap( void );
                    132: 
                    133: #ifdef __cplusplus
                    134: }
                    135: #endif
                    136: 
                    137: /*
                    138:  * This stuff only gets turned on if a customer wants to
                    139:  * debug his or her own use of malloc(), etc.
                    140:  */
                    141: 
                    142: #if defined( _DEBUG ) && defined( GF_ENABLE_HEAP_DEBUGGING )
                    143: /*
                    144:  * I need to make sure any prototypes created by alloc.h or malloc.h are
                    145:  * set up before I define the replacement macros.
                    146:  */
                    147: 
                    148: #if defined( GF_MICROSOFT_C )
                    149:   #include <malloc.h>
                    150: #elif defined( GF_BORLAND_CPP ) || defined( GF_TURBO_CPP )
                    151:   #include <alloc.h>
                    152: #endif
                    153: #include <string.h>
                    154: 
                    155: #define malloc( i ) _DebugMalloc( i, __FILE__, __LINE__ )          /* Tag: Debug private */
                    156: #define calloc( i, j ) _DebugCalloc( i, j, __FILE__, __LINE__ )    /* Tag: Debug private */
                    157: #define free( p ) _DebugFree( p, __FILE__, __LINE__ )              /* Tag: Debug private */
                    158: #define strdup( p ) _DebugStrdup( p, __FILE__, __LINE__ )          /* Tag: Debug private */
                    159: #endif
                    160: #endif /* #if defined( _DEBUG ) && defined( GF_ENABLE_HEAP_DEBUGGING ) */
                    161: 
                    162: /*
                    163:  * _GFAssertFailure is the function called by AL_ASSERT() and
                    164:  * AL_ASSERT_OBJECT() when their assertion fails.
                    165:  */
                    166: 
                    167: #ifdef __cplusplus
                    168: extern "C" {
                    169: #endif
                    170: 
                    171: void GF_CDECL _GFAssertFailure( const char GF_DLL_FAR *condition,
                    172:                                 const char GF_DLL_FAR *filename,
                    173:                                 int line,
                    174:                                 const char GF_DLL_FAR *message,
                    175:                                 ... );
                    176: #ifdef __cplusplus
                    177: }
                    178: #endif
                    179: 
                    180: /*
                    181:  * By definition, assertions go away when you turn on NDEBUG.  Our assertions
                    182:  * aren't exactly the same as those in the RTL, but we will use the
                    183:  * same philosophy for consistency.
                    184:  */
                    185: 
                    186: #if defined( NDEBUG )
                    187: 
                    188: /*
                    189:  * Microsoft C++ 7.0 with /W4 and /Ox and /DNDEBUG gives an error on
                    190:  * my GF_ASSERT statements.  Not only that, I can't turn off the
                    191:  * error.  This ugly hack seems to help.
                    192:  */
                    193: 
                    194: #if defined( GF_MICROSOFT_C )
                    195: #if ( _MSC_VER < 0x800 )
                    196: #  define GF_ASSERT( condition, message ) { int p = 0; }
                    197: #endif
                    198: #endif
                    199: 
                    200: #if !defined( GF_ASSERT )
                    201: #  define GF_ASSERT( condition, message ) ((void) 0)
                    202: #endif
                    203: 
                    204: #else /* #if defined( NDEBUG ) */
                    205: 
                    206: /*
                    207:  * In debug mode, GF_ASSERT() tests the condition, and generates
                    208:  * an abort with an error message when the condition fails.
                    209:  */
                    210: #define GF_ASSERT( condition, message ) /* Tag: Debug private */ \
                    211:             ( ( condition ) ?                                    \
                    212:                    (void) 0 :                                    \
                    213:                    _GFAssertFailure( #condition,                 \
                    214:                                      __FILE__,                   \
                    215:                                      __LINE__,                   \
                    216:                                      message ) )
                    217: 
                    218: #endif /* #if defined( NDEBUG ) ... #else */
                    219: 
                    220: #endif /* !defined( __DEBUG_H ) */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.