[e70e45] | 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) ((void)0) |
---|
| 25 | #define omMarkMemoryAsStatic() ((void)0) |
---|
| 26 | #define omUnMarkAsStaticAddr() ((void)0) |
---|
| 27 | #define omUnMarkMemoryAsStatic() ((void)0) |
---|
| 28 | #define omFreeKeptAddr() ((void)0) |
---|
[36ee6f] | 29 | #define omPrintUsedAddrs(fd,m) ((void)0) |
---|
| 30 | #define omPrintUsedTrackAddrs(fd,m) ((void)0) |
---|
[e70e45] | 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 */ |
---|
[36ee6f] | 40 | #define OM_FBINADDR 256 /* addr is bin addr */ |
---|
| 41 | #define OM_FKEEP 512 /* addr is never really freed */ |
---|
[13fe1b] | 42 | /* maximal flag: OM_FBIN and OM_FSIZE can not be at the same time, |
---|
[36ee6f] | 43 | and so can't OM_USED and OM_KEPT. Hence 1024 - BIN - USED*/ |
---|
| 44 | #define OM_FMAX 1024 - OM_FBIN - OM_FUSED |
---|
[91c4012] | 45 | typedef unsigned short omTrackFlags_t; |
---|
[e70e45] | 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(); |
---|
[36ee6f] | 59 | void omPrintUsedAddrs(FILE* fd, int max_frames); |
---|
| 60 | void omPrintUsedTrackAddrs(FILE* fd, int max_frames); |
---|
[e70e45] | 61 | |
---|
| 62 | void omMarkAsStaticAddr(void* addr); |
---|
| 63 | void omMarkMemoryAsStatic(); |
---|
| 64 | void omUnMarkAsStaticAddr(void* addr); |
---|
| 65 | void omUnMarkMemoryAsStatic(); |
---|
| 66 | #endif /* ! OM_NDEBUG */ |
---|
| 67 | |
---|
[fe7bd4] | 68 | |
---|
| 69 | #ifdef OM_TRACK_CUSTOM |
---|
| 70 | #ifdef OM_NDEBUG |
---|
[2f4434] | 71 | #define omSetCustomOfAddr(addr,value) ((void)0) |
---|
[fe7bd4] | 72 | #define omGetCustomOfAddr(addr) ((void*)0) |
---|
[2f4434] | 73 | #define omSetCustomOfTrackAddr(addr,value) ((void)0) |
---|
[fe7bd4] | 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 | |
---|
[e70e45] | 85 | /*BEGINPRIVATE*/ |
---|
| 86 | |
---|
| 87 | #if defined(OM_NDEBUG) || ! defined(OM_HAVE_TRACK) |
---|
| 88 | #define omGetUsedBlocksOfPage(page) (page->used_blocks) |
---|
| 89 | #else |
---|
[1aeec4] | 90 | #define omGetUsedBlocksOfPage(page) ((long)(page->used_blocks & ~(((unsigned long) 1) << (BIT_SIZEOF_LONG -1)))) |
---|
[e70e45] | 91 | #endif |
---|
| 92 | |
---|
| 93 | #ifndef OM_NDEBUG |
---|
[4fc79f1] | 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; |
---|
[e70e45] | 99 | |
---|
[f103fb] | 100 | void omFreeKeptAddrFromBin(omBin bin); |
---|
[e70e45] | 101 | /*********************************************************************** |
---|
| 102 | * |
---|
| 103 | * omDebugCheck.c |
---|
| 104 | * |
---|
| 105 | **********************************************************************/ |
---|
[13fe1b] | 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, |
---|
[e70e45] | 108 | omError_t report, OM_FLR_DECL); |
---|
[13fe1b] | 109 | omError_t omDoCheckBinAddr(void* addr, void* bin_size, omTrackFlags_t flags, char level, |
---|
[e70e45] | 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); |
---|
[13fe1b] | 113 | omError_t omReportAddrError(omError_t error, omError_t report, void* addr, |
---|
| 114 | void* bin_size, omTrackFlags_t flags, |
---|
[e70e45] | 115 | OM_FLR_DECL, const char* fmt, ...); |
---|
[13fe1b] | 116 | omError_t omDoCheckBin(omBin bin, int normal_bin, char level, |
---|
[e70e45] | 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*)); |
---|
[13fe1b] | 120 | omError_t omDoCheckAddr(void* addr, void* bin_size, omTrackFlags_t flags, char level, |
---|
[e70e45] | 121 | omError_t report, OM_FLR_DECL); |
---|
[36ee6f] | 122 | int omIsInKeptAddrList(void* addr); |
---|
[e70e45] | 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); |
---|
[36ee6f] | 139 | void* omMarkAsFreeTrackAddr(void* addr, int keep, omTrackFlags_t *flags, OM_FLR_DECL); |
---|
[13fe1b] | 140 | omError_t omCheckTrackAddr(void* addr, void* bin_size, omTrackFlags_t flags, char level, |
---|
[e70e45] | 141 | omError_t report_error, OM_FLR_DECL); |
---|
[36ee6f] | 142 | void omPrintTrackAddrInfo(FILE* fd, void* addr, int max_frames); |
---|
[e70e45] | 143 | omBin omGetOrigSpecBinOfTrackAddr(void* addr); |
---|
| 144 | size_t omOutSizeOfTrackAddr(void* addr); |
---|
| 145 | extern int omIsStaticTrackAddr(void* addr); |
---|
[384936] | 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))) |
---|
[e70e45] | 149 | #else |
---|
| 150 | #define omIsStaticTrackAddr(addr) 0 |
---|
| 151 | #endif |
---|
[36ee6f] | 152 | void* omAddr_2_OutAddr(void* addr); |
---|
[e70e45] | 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 | * |
---|
[13fe1b] | 167 | * Some Handy Macros |
---|
[e70e45] | 168 | * |
---|
| 169 | **********************************************************************/ |
---|
| 170 | #define omCheckReturn(cond) \ |
---|
| 171 | do {omError_t _status = cond; if (_status) return _status;} while (0) |
---|
| 172 | #define omCheckReturnError(cond, error) \ |
---|
[384936] | 173 | do {if (cond) return omReportError(error, report, OM_FLR_VAL, "");} while (0) |
---|
[e70e45] | 174 | #define omCheckReturnCorrupted(cond) \ |
---|
| 175 | omCheckReturnError(cond, omError_MemoryCorrupted) |
---|
| 176 | #define omAddrCheckReturn(cond) \ |
---|
| 177 | do \ |
---|
| 178 | { \ |
---|
| 179 | omError_t _status = cond; \ |
---|
[13fe1b] | 180 | if (_status && (_status != omError_MaxError)) \ |
---|
[e70e45] | 181 | { \ |
---|
[36ee6f] | 182 | _omPrintAddrInfo(stderr, _status, addr, bin_size, flags, 10, " occured for"); \ |
---|
[e70e45] | 183 | return _status; \ |
---|
| 184 | } \ |
---|
| 185 | } while (0) |
---|
| 186 | #define omAddrCheckReturnError(cond, error) \ |
---|
[384936] | 187 | do {if (cond) return omReportAddrError(error, report, addr, bin_size, flags, OM_FLR_VAL, "");} while (0) |
---|
[e70e45] | 188 | #define omAddrCheckReturnCorrupted(cond) \ |
---|
| 189 | omAddrCheckReturnError(cond, omError_MemoryCorrupted) |
---|
| 190 | |
---|
[f103fb] | 191 | #else |
---|
| 192 | #define omFreeKeptAddrFromBin(bin) ((void)0) |
---|
[e70e45] | 193 | #endif /* ! OM_NDEBUG */ |
---|
| 194 | /*ENDPRIVATE*/ |
---|
| 195 | |
---|
| 196 | #endif /* OM_DEBUG_H */ |
---|