/************************************************************************/ /* SISCO SOFTWARE MODULE HEADER *****************************************/ /************************************************************************/ /* (c) Copyright Systems Integration Specialists Company, Inc., */ /* 1986-2004 All Rights Reserved */ /* */ /* MODULE NAME : mem_chk.h */ /* PRODUCT(S) : General Use */ /* */ /* MODULE DESCRIPTION : */ /* This module contains the declarations of the dynamic memory */ /* handling functions. */ /* */ /* MODIFICATION LOG : */ /* Date Who Rev Comments */ /* -------- --- ------ ------------------------------------------- */ /* 02/06/04 EJV 16 Added dyn_mem_ptr_status2. */ /* 04/14/03 DSF 15 Cleanup */ /* 04/08/03 DSF 14 added m_mem_crt_debug */ /* 04/04/03 DSF 13 new/delete checks for MFC */ /* 08/20/01 JRB 12 chk_* functions chged to nd_chk_*. */ /* chk_* names are now ALWAYS macros. */ /* Make 4 sets of macros depending on whether */ /* DEBUG_SISCO and/or SMEM_ENABLE defined. */ /* Don't define SMEM_ENABLE, do from makefiles. */ /* Remove logging backward compatibility stuff. */ /* 08/06/01 RKR 11 S_THISFILE was removed, need a thisFileName */ /* 03/19/01 JRB 10 Move SMEM context defs to "smem.h". */ /* 01/25/01 DSF 09 new/delete checks */ /* 11/01/00 MDE 08 Additional SMEM work */ /* 01/21/00 MDE 07 Added SMEM support */ /* 09/13/99 MDE 06 Added SD_CONST modifiers */ /* 01/26/98 MDE 05 Added 'chk_strdup' */ /* 12/08/98 MDE 04 Added 'ST_BOOLEAN m_auto_hw_log' */ /* 10/08/98 MDE 03 Migrated to updated SLOG interface */ /* 10/14/97 DSF 02 m_bad_ptr_val is now a pointer */ /* 09/16/97 DSF 01 chk_debug_en is UINT */ /* 04/02/97 DTL 7.00 MMSEASE 7.0 release. See MODL70.DOC for */ /* history. */ /************************************************************************/ #ifndef MEM_CHK_INCLUDED #define MEM_CHK_INCLUDED #ifdef __cplusplus extern "C" { #endif #include #ifdef SMEM_ENABLE #include "smem.h" #endif /************************************************************************/ /* MEM_CHK MACROS and FUNCTION PROTOTYPES */ /* Memory allocation macros. There are 4 sets of macros depending on */ /* DEBUG_SISCO and SMEM_ENABLE. Each set of macros calls a unique set */ /* of functions. */ /* The DEBUG macros use thisFileName (instead of __FILE__) to reduce */ /* memory usage. Any file using these macros MUST contain the following */ /* statement: */ /* static char *thisFileName = __FILE__; */ /************************************************************************/ #if defined(SMEM_ENABLE) #if defined(DEBUG_SISCO) #define M_MALLOC(ctx,x) x_m_malloc (ctx,x, thisFileName,__LINE__) #define M_CALLOC(ctx,x,y) x_m_calloc (ctx,x,y,thisFileName,__LINE__) #define M_REALLOC(ctx,x,y) x_m_realloc (ctx,x,y,thisFileName,__LINE__) #define M_STRDUP(ctx,x) x_m_strdup (ctx,x, thisFileName,__LINE__) #define M_FREE(ctx,x) x_m_free (ctx,x, thisFileName,__LINE__) #define chk_malloc(x) x_m_malloc (MSMEM_GEN,x, thisFileName,__LINE__) #define chk_calloc(x,y) x_m_calloc (MSMEM_GEN,x,y,thisFileName,__LINE__) #define chk_realloc(x,y) x_m_realloc (MSMEM_GEN,x,y,thisFileName,__LINE__) #define chk_strdup(x) x_m_strdup (MSMEM_GEN,x, thisFileName,__LINE__) #define chk_free(x) x_m_free (MSMEM_GEN,x, thisFileName,__LINE__) ST_VOID *x_m_malloc (SMEM_CONTEXT *smem_ctx, ST_UINT size, SD_CONST ST_CHAR *SD_CONST file, SD_CONST ST_INT line); ST_VOID *x_m_calloc (SMEM_CONTEXT *smem_ctx, ST_UINT num, ST_UINT size, SD_CONST ST_CHAR *SD_CONST file, SD_CONST ST_INT line); ST_VOID *x_m_realloc (SMEM_CONTEXT *smem_ctx, ST_VOID *old, ST_UINT size, SD_CONST ST_CHAR *SD_CONST file, SD_CONST ST_INT line); ST_VOID x_m_free (SMEM_CONTEXT *smem_ctx, ST_VOID *ptr, SD_CONST ST_CHAR *SD_CONST file, SD_CONST ST_INT line); ST_CHAR *x_m_strdup (SMEM_CONTEXT *smem_ctx, ST_CHAR *str, SD_CONST ST_CHAR *SD_CONST file, SD_CONST ST_INT line); #else /* !DEBUG_SISCO */ #define M_MALLOC(ctx,x) nd_m_malloc (ctx,x) #define M_CALLOC(ctx,x,y) nd_m_calloc (ctx,x,y) #define M_REALLOC(ctx,x,y) nd_m_realloc (ctx,x,y) #define M_STRDUP(ctx,x) nd_m_strdup (ctx,x) #define M_FREE(ctx,x) nd_m_free (ctx,x) #define chk_malloc(x) nd_m_malloc (MSMEM_GEN,x) #define chk_calloc(x,y) nd_m_calloc (MSMEM_GEN,x,y) #define chk_realloc(x,y) nd_m_realloc (MSMEM_GEN,x,y) #define chk_strdup(x) nd_m_strdup (MSMEM_GEN,x) #define chk_free(x) nd_m_free (MSMEM_GEN,x) ST_VOID *nd_m_malloc (SMEM_CONTEXT *smem_ctx, ST_UINT size); ST_VOID *nd_m_calloc (SMEM_CONTEXT *smem_ctx, ST_UINT num, ST_UINT size); ST_VOID *nd_m_realloc (SMEM_CONTEXT *smem_ctx, ST_VOID *old, ST_UINT size); ST_VOID nd_m_free (SMEM_CONTEXT *smem_ctx, ST_VOID *ptr); ST_CHAR *nd_m_strdup (SMEM_CONTEXT *smem_ctx, ST_CHAR *str); #endif /* !DEBUG_SISCO */ #else /* !SMEM_ENABLE */ #if defined(DEBUG_SISCO) #define M_MALLOC(ctx,x) x_chk_malloc (x, thisFileName,__LINE__) #define M_CALLOC(ctx,x,y) x_chk_calloc (x,y,thisFileName,__LINE__) #define M_REALLOC(ctx,x,y) x_chk_realloc (x,y,thisFileName,__LINE__) #define M_STRDUP(ctx,x) x_chk_strdup (x, thisFileName,__LINE__) #define M_FREE(ctx,x) x_chk_free (x, thisFileName,__LINE__) #define chk_malloc(x) x_chk_malloc (x, thisFileName,__LINE__) #define chk_calloc(x,y) x_chk_calloc (x,y,thisFileName,__LINE__) #define chk_realloc(x,y) x_chk_realloc (x,y,thisFileName,__LINE__) #define chk_strdup(x) x_chk_strdup (x, thisFileName,__LINE__) #define chk_free(x) x_chk_free (x, thisFileName,__LINE__) ST_VOID *x_chk_realloc (ST_VOID *old, ST_UINT size, SD_CONST ST_CHAR *SD_CONST file, SD_CONST ST_INT line); ST_VOID *x_chk_malloc (ST_UINT size, SD_CONST ST_CHAR *SD_CONST file, SD_CONST ST_INT line); ST_VOID *x_chk_calloc (ST_UINT num, ST_UINT size, SD_CONST ST_CHAR *SD_CONST file, SD_CONST ST_INT line); ST_CHAR *x_chk_strdup (ST_CHAR *str, SD_CONST ST_CHAR *SD_CONST file, SD_CONST ST_INT line); ST_VOID x_chk_free (ST_VOID *old, SD_CONST ST_CHAR *SD_CONST file, SD_CONST ST_INT line); #else /* !DEBUG_SISCO */ #define M_MALLOC(ctx,x) nd_chk_malloc (x) #define M_CALLOC(ctx,x,y) nd_chk_calloc (x,y) #define M_REALLOC(ctx,x,y) nd_chk_realloc (x,y) #define M_STRDUP(ctx,x) nd_chk_strdup (x) #define M_FREE(ctx,x) nd_chk_free (x) #define chk_malloc(x) nd_chk_malloc (x) #define chk_calloc(x,y) nd_chk_calloc (x,y) #define chk_realloc(x,y) nd_chk_realloc (x,y) #define chk_strdup(x) nd_chk_strdup (x) #define chk_free(x) nd_chk_free (x) ST_VOID *nd_chk_malloc (ST_UINT size); ST_VOID *nd_chk_calloc (ST_UINT num, ST_UINT size); ST_VOID *nd_chk_realloc (ST_VOID *old, ST_UINT size); ST_CHAR *nd_chk_strdup (ST_CHAR *str); ST_VOID nd_chk_free (ST_VOID *ptr); #endif /* !DEBUG_SISCO */ #endif /* !SMEM_ENABLE */ /************************************************************************/ /* chk_debug_en bit assignments */ /* These are the defines to be used by all new applications */ #define MEM_LOG_ERR 0x0001 #define MEM_LOG_CALLOC 0x0002 #define MEM_LOG_MALLOC 0x0004 #define MEM_LOG_REALLOC 0x0008 #define MEM_LOG_FREE 0x0010 extern ST_UINT chk_debug_en; /************************************************************************/ /* Replacement Memory allocation functions. */ /************************************************************************/ ST_VOID init_mem_chk (ST_VOID); ST_VOID dyn_mem_ptr_status (ST_VOID); ST_UINT dyn_mem_ptr_status2 (ST_VOID *marker_ptr); ST_VOID dyn_mem_ptr_statistics (ST_BOOLEAN log_to_screen); ST_VOID check_mem_list (ST_VOID); ST_RET chk_alloc_ptr (ST_VOID *ptr); /************************************************************************/ /* fatal error service function pointers, used for unrecoverable errors */ /************************************************************************/ #define MEM_ERR_EXIT_CODE 2001 extern ST_VOID *(*m_memerr_fun)(ST_UINT size); /* for malloc */ extern ST_VOID *(*c_memerr_fun)(ST_UINT num, ST_UINT size); /* for calloc */ extern ST_VOID *(*r_memerr_fun)(ST_VOID *old, ST_UINT size); /* for realloc*/ /************************************************************************/ /* statistics */ /************************************************************************/ extern ST_UINT32 chk_curr_mem_count; extern ST_UINT32 chk_max_dyn_mem_ptrs; extern ST_UINT32 chk_max_mem_allocated; extern ST_UINT32 chk_curr_mem_size; /************************************************************************/ /************************************************************************/ /* HEAP checking functions and macros */ /* These defines are used to control the level or print in chk_hp */ #define DEBUG_HEAP_SUM 0x0001 #define DEBUG_HEAP_ENTRY 0x0002 #define DEBUG_HEAP_ALL 0x0003 #ifdef HEAP_CHECK_ENABLE #define HEAP_CHECK() chk_hp (0, (ST_CHAR *) __FILE__, __LINE__) #else #define HEAP_CHECK() #endif ST_RET msoft_heap_check (ST_INT16); ST_RET chk_hp (ST_INT16 prt_mask,ST_CHAR *file,ST_INT line); /************************************************************************/ extern ST_VOID *m_bad_ptr_val; /* This variable used to enable MSOFT heap check calls on every alloc */ /* and free call. Also sets the unused heap memory to 0x55's */ extern ST_BOOLEAN m_heap_check_enable; /* This variable used to enable list validation and overwrite checking */ /* on every alloc and free call. */ extern ST_BOOLEAN m_check_list_enable; /* Set this = SD_FALSE to speed up the debug version. When SD_TRUE, it */ /* enables searching the memory list for the element before accessing */ /* the memory during chk_realloc and chk_free calls */ extern ST_BOOLEAN m_find_node_enable; /* This variable will cause chk_realloc to not realloc when the new */ /* size is smaller than the old size */ extern ST_BOOLEAN m_no_realloc_smaller; /* Dump memory table whenever high water mark is advanced */ extern ST_BOOLEAN m_auto_hw_log; extern ST_CHAR *m_pad_string; extern ST_INT m_num_pad_bytes; extern ST_BOOLEAN m_fill_en; extern ST_UCHAR m_fill_byte; extern ST_BOOLEAN m_mem_debug; extern ST_BOOLEAN m_mem_crt_debug; /* This function pointer can be set to select a function to be called */ /* in case of memory error. */ extern ST_VOID (*mem_chk_err)(ST_VOID); /* Read only */ extern ST_UINT m_mem_overhead; /************************************************************************/ /************************************************************************/ #ifdef __cplusplus } #endif #ifdef __cplusplus /************************************************************************/ /* deal with new and delete */ /************************************************************************/ #if defined (DEBUG_SISCO) && defined (DEBUG_NEW_SISCO) #include void * operator new(size_t nSize) throw (std::bad_alloc); void * operator new(size_t nSize, const char *fileName, const int lineNum) throw (std::bad_alloc); void * operator new(size_t nSize, const std::nothrow_t&) throw (); void * operator new[](size_t nSize) throw (std::bad_alloc); void * operator new[](size_t nSize, const char *fileName, const int lineNum) throw (std::bad_alloc); void * operator new[](size_t nSize, const std::nothrow_t&) throw (); void operator delete(void *p) throw (); void operator delete(void *p, const char *fileName, const int lineNum) throw (); void operator delete[](void *p) throw (); void operator delete[](void *p, const char *fileName, const int lineNum) throw (); #ifndef MEM_CHK #define new new(thisFileName, __LINE__) #endif #endif #if defined (DEBUG_SISCO) && defined (DEBUG_NEW_MFC) #include #if !defined (__AFX_H__) #include #define THIS_FILE __FILE__ void* __cdecl operator new(size_t nSize, LPCSTR lpszFileName, int nLine); #define DEBUG_NEW new(THIS_FILE, __LINE__) void __cdecl operator delete(void* p, LPCSTR lpszFileName, int nLine); void * __cdecl operator new[](size_t); void* __cdecl operator new[](size_t nSize, LPCSTR lpszFileName, int nLine); void __cdecl operator delete[](void* p, LPCSTR lpszFileName, int nLine); void __cdecl operator delete[](void *); #endif /* AFX */ #endif /* DEBUG_NEW_MFC */ #endif /* __cplusplus */ #endif /* mem_chk.h already included */