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