1 /******************************************************************* 2 * File: omDebug.h 3 * Purpose: declaration of common Debug/Check/Track stuff 4 * Author: obachman@mathematik.uni-kl.de (Olaf Bachmann) 5 * Created: 7/00 6 *******************************************************************/ 7 #ifndef OM_DEBUG_H 8 #define OM_DEBUG_H 9 10 11 #if defined(OM_NDEBUG) || ! defined(OM_HAVE_TRACK) 12 #define omIsTrackAddr(addr) 0 13 #define omIsTrackAddrPage(page) 0 14 #define omIsNormalBinPageAddr(addr) omIsBinPageAddr(addr) 15 #define omIsBinAddrTrackAddr(addr) 0 16 #else 17 #define omIsTrackAddrBinPage(bin_page) ((bin_page)->used_blocks < 0) 18 #define omIsBinAddrTrackAddr(addr) omIsTrackAddrBinPage(omGetBinPageOfAddr(addr)) 19 #define omIsTrackAddr(addr) (omIsBinPageAddr(addr) && omIsBinAddrTrackAddr(addr)) 20 #define omIsNormalBinPageAddr(addr) (omIsBinPageAddr(addr) && !omIsBinAddrTrackAddr(addr)) 21 #endif 22 23 #if defined(OM_NDEBUG) 24 #define omMarkAsStaticAddr(addr) do {} while (0) 25 #define omMarkMemoryAsStatic() do {} while (0) 26 #define omUnMarkAsStaticAddr() do {} while (0) 27 #define omUnMarkMemoryAsStatic() do {} while (0) 28 #define omFreeKeptAddr() do {} while (0) 29 #define omPrintUsedAddrs(fd,m) do {} while (0) 30 #define omPrintUsedTrackAddrs(fd,m) do {} while (0) 31 #else 32 #define OM_FBIN 1 /* size_bin is bin */ 33 #define OM_FSIZE 2 /* size_bin is size */ 34 #define OM_FUSED 4 /* is in use, if set */ 35 #define OM_FKEPT 8 /* had been freed, if set */ 36 #define OM_FSTATIC 16 /* if set, considered to be static, i.e. never be freed */ 37 #define OM_FZERO 32 /* for Alloc0 */ 38 #define OM_FALIGN 64 /* for AllocAligned */ 39 #define OM_FSLOPPY 128 /* be sloppy about arguments */ 40 #define OM_FBINADDR 256 /* addr is bin addr */ 41 #define OM_FKEEP 512 /* addr is never really freed */ 42 /* maximal flag: OM_FBIN and OM_FSIZE can not be at the same time, 43 and so can't OM_USED and OM_KEPT. Hence 1024 - BIN - USED*/ 44 #define OM_FMAX 1024 - OM_FBIN - OM_FUSED 45 typedef unsigned short omTrackFlags_t; 46 47 void* _omDebugAlloc(void* size_bin, omTrackFlags_t flags, OM_CTFL_DECL); 48 void* _omDebugRealloc(void* old_addr, void* old_size_bin, void* new_size_bin, 49 omTrackFlags_t old_flags, omTrackFlags_t new_flags, OM_CTFL_DECL); 50 void _omDebugFree(void* addr, void* size_bin, omTrackFlags_t flags, OM_CFL_DECL); 51 void* _omDebugMemDup(void* addr, omTrackFlags_t flags, OM_CTFL_DECL); 52 char* _omDebugStrDup(const char* addr, OM_TFL_DECL); 53 54 omError_t _omDebugBin(omBin bin, OM_CFL_DECL); 55 omError_t _omDebugMemory(OM_CFL_DECL); 56 omError_t _omDebugAddr(void* addr, void* bin_size, omTrackFlags_t flags, OM_CFL_DECL); 57 58 void omFreeKeptAddr(); 59 void omPrintUsedAddrs(FILE* fd, int max_frames); 60 void omPrintUsedTrackAddrs(FILE* fd, int max_frames); 61 62 void omMarkAsStaticAddr(void* addr); 63 void omMarkMemoryAsStatic(); 64 void omUnMarkAsStaticAddr(void* addr); 65 void omUnMarkMemoryAsStatic(); 66 #endif /* ! OM_NDEBUG */ 67 68 69 #ifdef OM_TRACK_CUSTOM 70 #ifdef OM_NDEBUG 71 #define omSetCustomOfAddr(addr,value) do {} while (0) 72 #define omGetCustomOfAddr(addr) ((void*)0) 73 #define omSetCustomOfTrackAddr(addr,value) do {} while (0) 74 #define omGetCustomOfTrackAddr(addr) ((void*)0) 75 #else 76 void omSetCustomOfTrackAddr(void* addr, void* value); 77 void* omGetCustomOfTrackAddr(void* addr); 78 #define omSetCustomOfAddr(addr,value) \ 79 do{if (omIsTrackAddr(addr)) omSetCustomOfTrackAddr(addr,value);}while(0) 80 #define omGetCustomOfAddr(addr) \ 81 (omIsTrackAddr(addr) ? omGetCustomOfTrackAddr(addr) : NULL) 82 #endif /* OM_NDEBUG */ 83 #endif /* OM_TRACK_CUSTOM */ 84 85 /*BEGINPRIVATE*/ 86 87 #if defined(OM_NDEBUG) || ! defined(OM_HAVE_TRACK) 88 #define omGetUsedBlocksOfPage(page) (page->used_blocks) 89 #else 90 #define omGetUsedBlocksOfPage(page) ((long)(page->used_blocks & ~(((unsigned long) 1) << (BIT_SIZEOF_LONG -1)))) 91 #endif 92 93 #ifndef OM_NDEBUG 94 extern void* om_KeptAddr; 95 extern void* om_LastKeptAddr; 96 extern unsigned long om_MaxAddr; 97 extern unsigned long om_MinAddr; 98 extern void* om_AlwaysKeptAddrs; 99 100 void omFreeKeptAddrFromBin(omBin bin); 101 /*********************************************************************** 102 * 103 * omDebugCheck.c 104 * 105 **********************************************************************/ 106 omError_t omCheckPtr(const void* ptr, omError_t report, OM_FLR_DECL); 107 omError_t _omCheckAddr(void* addr, void* size_bin, omTrackFlags_t flags, char check, 108 omError_t report, OM_FLR_DECL); 109 omError_t omDoCheckBinAddr(void* addr, void* bin_size, omTrackFlags_t flags, char level, 110 omError_t report, OM_FLR_DECL); 111 omError_t _omCheckBin(omBin bin, int normal_bin, char check, omError_t report, OM_FLR_DECL); 112 omError_t _omCheckMemory(char check, omError_t report, OM_FLR_DECL); 113 omError_t omReportAddrError(omError_t error, omError_t report, void* addr, 114 void* bin_size, omTrackFlags_t flags, 115 OM_FLR_DECL, const char* fmt, ...); 116 omError_t omDoCheckBin(omBin bin, int normal_bin, char level, 117 omError_t report, OM_FLR_DECL); 118 void omIterateTroughAddrs(int normal, int track, void (*CallBackUsed)(void*), void (*CallBackFree)(void*)); 119 void omIterateTroughBinAddrs(omBin bin, void (*CallBackUsed)(void*), void (*CallBackFree)(void*)); 120 omError_t omDoCheckAddr(void* addr, void* bin_size, omTrackFlags_t flags, char level, 121 omError_t report, OM_FLR_DECL); 122 int omIsInKeptAddrList(void* addr); 123 124 /*********************************************************************** 125 * 126 * omDebugTrack.c 127 * 128 **********************************************************************/ 129 #ifdef OM_HAVE_TRACK 130 extern omBin_t om_StaticTrackBin[]; 131 extern omBin om_Size2TrackBin[]; 132 #define omSmallSize2TrackBin(size) om_Size2TrackBin[((size) -1)>>LOG_SIZEOF_OM_ALIGNMENT] 133 extern omBinPage om_JustFreedPage; 134 extern void omFreeTrackAddr(void* addr); 135 extern size_t omOutSizeOfTrackAddr(void* addr); 136 extern omSpecBin om_SpecTrackBin; 137 138 void* omAllocTrackAddr(void* bin_size, omTrackFlags_t flags, char track, OM_FLR_DECL); 139 void* omMarkAsFreeTrackAddr(void* addr, int keep, omTrackFlags_t *flags, OM_FLR_DECL); 140 omError_t omCheckTrackAddr(void* addr, void* bin_size, omTrackFlags_t flags, char level, 141 omError_t report_error, OM_FLR_DECL); 142 void omPrintTrackAddrInfo(FILE* fd, void* addr, int max_frames); 143 omBin omGetOrigSpecBinOfTrackAddr(void* addr); 144 size_t omOutSizeOfTrackAddr(void* addr); 145 extern int omIsStaticTrackAddr(void* addr); 146 #define omSetTrackOfUsedBlocks(ub) (ub |= (((unsigned long) 1) << (BIT_SIZEOF_LONG -1))) 147 #define omUnsetTrackOfUsedBlocks(ub) (ub &= ~(((unsigned long) 1) << (BIT_SIZEOF_LONG -1))) 148 #define omIsSetTrackOfUsedBlocks(ub) (ub & (((unsigned long) 1) << (BIT_SIZEOF_LONG -1))) 149 #else 150 #define omIsStaticTrackAddr(addr) 0 151 #endif 152 void* omAddr_2_OutAddr(void* addr); 153 154 /*********************************************************************** 155 * 156 * omBinPage.c 157 * 158 **********************************************************************/ 159 int omIsKnownMemoryRegion(omBinPageRegion region); 160 omError_t omCheckBinPageRegion(omBinPageRegion region, int level, omError_t report, OM_FLR_DECL); 161 omError_t omCheckBinPageRegions(int level, omError_t report, OM_FLR_DECL); 162 omBinPageRegion omFindRegionOfAddr(void* addr); 163 int omIsAddrOnFreeBinPage(void* addr); 164 165 /*********************************************************************** 166 * 167 * Some Handy Macros 168 * 169 **********************************************************************/ 170 #define omCheckReturn(cond) \ 171 do {omError_t _status = cond; if (_status) return _status;} while (0) 172 #define omCheckReturnError(cond, error) \ 173 do {if (cond) return omReportError(error, report, OM_FLR_VAL, "");} while (0) 174 #define omCheckReturnCorrupted(cond) \ 175 omCheckReturnError(cond, omError_MemoryCorrupted) 176 #define omAddrCheckReturn(cond) \ 177 do \ 178 { \ 179 omError_t _status = cond; \ 180 if (_status && (_status != omError_MaxError)) \ 181 { \ 182 _omPrintAddrInfo(stderr, _status, addr, bin_size, flags, 10, " occurred for"); \ 183 return _status; \ 184 } \ 185 } while (0) 186 #define omAddrCheckReturnError(cond, error) \ 187 do {if (cond) return omReportAddrError(error, report, addr, bin_size, flags, OM_FLR_VAL, "");} while (0) 188 #define omAddrCheckReturnCorrupted(cond) \ 189 omAddrCheckReturnError(cond, omError_MemoryCorrupted) 190 191 #else 192 #define omFreeKeptAddrFromBin(bin) do {} while (0) 193 #endif /* ! OM_NDEBUG */ 194 /*ENDPRIVATE*/ 195 196 #endif /* OM_DEBUG_H */ 197