10 #include "omDerivedConfig.h" 13 #include "omDefaultConfig.h" 25 #ifndef OM_MIN_SIZEOF_FRONT_PATTERN 26 #define OM_MIN_SIZEOF_FRONT_PATTERN (OM_MIN_SIZEWOF_FRONT_PATTERN*SIZEOF_STRICT_ALIGNMENT) 29 #ifndef OM_MIN_SIZEOF_BACK_PATTERN 30 #define OM_MIN_SIZEOF_BACK_PATTERN (OM_MIN_SIZEWOF_BACK_PATTERN*SIZEOF_STRICT_ALIGNMENT) 34 typedef struct omTrackAddr_s omTrackAddr_t;
35 typedef omTrackAddr_t * omTrackAddr;
41 #ifdef OM_TRACK_FILE_LINE 43 const char* alloc_file;
45 #ifdef OM_TRACK_RETURN 48 #ifdef OM_TRACK_BACKTRACE 49 #define OM_TRACK_ADDR_MEM_1 alloc_frames 52 char* alloc_frames[OM_MAX_KEPT_FRAMES];
54 #define OM_TRACK_ADDR_MEM_1 bin_size 56 #define OM_TRACK_ADDR_MEM_2 bin_size 60 #ifdef OM_TRACK_CUSTOM 63 #ifdef OM_TRACK_FILE_LINE 64 #define OM_TRACK_ADDR_MEM_3 free_line 68 const char* free_file;
70 #ifdef OM_TRACK_RETURN 71 #ifndef OM_TRACK_ADDR_MEM_3 72 #define OM_TRACK_ADDR_MEM_3 free_r 76 #ifdef OM_TRACK_BACKTRACE 77 #define OM_TRACK_ADDR_MEM_4 free_frames 80 void* free_frames[OM_MAX_KEPT_FRAMES];
87 static int omCheckPattern(
char*
s,
char p,
size_t size);
89 #define OM_TRACK_MAX 5 90 static struct omTrackAddr_s track_addr;
92 #define OM_SIZEOF_TRACK_ADDR_1 OM_STRICT_ALIGN_SIZE(((char*)&track_addr.alloc_frames-(char*)&track_addr)) 93 #define OM_SIZEOF_TRACK_ADDR_2 OM_STRICT_ALIGN_SIZE(((char*)&track_addr.bin_size-(char*)&track_addr)) 94 #define OM_SIZEOF_TRACK_ADDR_3 OM_STRICT_ALIGN_SIZE(((char*)&track_addr.free_line-(char*)&track_addr)+OM_MIN_SIZEOF_FRONT_PATTERN) 95 #define OM_SIZEOF_TRACK_ADDR_4 OM_STRICT_ALIGN_SIZE(((char*)&track_addr.free_frames-(char*)&track_addr)+OM_MIN_SIZEOF_FRONT_PATTERN) 96 #define OM_SIZEOF_TRACK_ADDR_5 OM_STRICT_ALIGN_SIZE(sizeof(struct omTrackAddr_s)+OM_MIN_SIZEOF_FRONT_PATTERN) 99 #define OM_SIZEOF_TRACK_ADDR_1 OM_STRICT_ALIGN_SIZE(((char*)&track_addr.OM_TRACK_ADDR_MEM_1-(char*)&track_addr)) 100 #define OM_SIZEOF_TRACK_ADDR_2 OM_STRICT_ALIGN_SIZE(((char*)&track_addr.OM_TRACK_ADDR_MEM_2-(char*)&track_addr)) 101 #define OM_SIZEOF_TRACK_ADDR_3 OM_STRICT_ALIGN_SIZE(((char*)&track_addr.OM_TRACK_ADDR_MEM_3-(char*)&track_addr)+OM_MIN_SIZEOF_FRONT_PATTERN) 102 #ifdef OM_TRACK_ADDR_MEM_4 103 #define OM_SIZEOF_TRACK_ADDR_4 OM_STRICT_ALIGN_SIZE(((char*)&track_addr.OM_TRACK_ADDR_MEM_4-(char*)&track_addr)+OM_MIN_SIZEOF_FRONT_PATTERN) 105 #define OM_SIZEOF_TRACK_ADDR_4 OM_SIZEOF_TRACK_ADDR_5 107 #define OM_SIZEOF_TRACK_ADDR_5 OM_STRICT_ALIGN_SIZE(sizeof(struct omTrackAddr_s)+OM_MIN_SIZEOF_FRONT_PATTERN) 109 #define OM_SIZEOF_TRACK_ADDR(i) \ 111 (i == 4 ? OM_SIZEOF_TRACK_ADDR_4 : OM_SIZEOF_TRACK_ADDR_5) : \ 112 (i == 3 ? OM_SIZEOF_TRACK_ADDR_3 : (i == 2 ? OM_SIZEOF_TRACK_ADDR_2 : OM_SIZEOF_TRACK_ADDR_1))) 114 OM_INLINE_LOCAL omTrackAddr omOutAddr_2_TrackAddr(
void* addr);
116 #define _omOutSize_2_TrackAddrSize(size, track) \ 117 (size + OM_SIZEOF_TRACK_ADDR(track) + (track > 2 ? OM_MIN_SIZEOF_BACK_PATTERN : 0)) 119 #define _omTrackAddr_2_SizeOfTrackAddrHeader(d_addr) ((size_t) OM_SIZEOF_TRACK_ADDR(((omTrackAddr) (d_addr))->track)) 120 #define _omTrackAddr_2_OutSize(d_addr) \ 121 (((omTrackAddr) (d_addr))->track > 2 ? \ 122 omTrack3Addr_2_OutSize(d_addr) : omSizeOfBinAddr(d_addr) - omTrackAddr_2_SizeOfTrackAddrHeader(d_addr)) 123 #define _omTrack3Addr_2_OutSize(d_addr) \ 124 ((((omTrackAddr) (d_addr))->flags & OM_FBIN) ? \ 125 (((omBin)((omTrackAddr) (d_addr))->bin_size)->sizeW) << LOG_SIZEOF_LONG : \ 126 ((size_t)((omTrackAddr) (d_addr))->bin_size)) 129 #define _omTrackAddr_2_FrontPattern(d_addr) \ 130 ((void*)((unsigned long)d_addr + omTrackAddr_2_SizeOfTrackAddrHeader(d_addr) - OM_MIN_SIZEOF_FRONT_PATTERN)) 131 #define _omTrackAddr_2_SizeOfFrontPattern(d_addr) \ 132 ((char*) omTrackAddr_2_OutAddr(d_addr) - (char*) omTrackAddr_2_FrontPattern(d_addr)) 133 #define _omTrackAddr_2_BackPattern(d_addr) \ 134 ((char*) ((unsigned long)d_addr + omTrackAddr_2_SizeOfTrackAddrHeader(d_addr) + _omTrack3Addr_2_OutSize(d_addr))) 135 #define _omTrackAddr_2_SizeOfBackPattern(d_addr) \ 136 ((char*) d_addr + omSizeOfBinAddr(d_addr) - omTrackAddr_2_BackPattern(d_addr)) 137 #define omTrackAddr_2_OutAddr(d_addr) ((void*)((unsigned long)d_addr + omTrackAddr_2_SizeOfTrackAddrHeader(d_addr))) 140 #ifdef OM_INTERNAL_DEBUG 141 static size_t omTrackAddr_2_SizeOfTrackAddrHeader(omTrackAddr d_addr)
145 d_addr->track > 0 && d_addr->track <= 5);
146 size = _omTrackAddr_2_SizeOfTrackAddrHeader(d_addr);
149 static void* omTrackAddr_2_FrontPattern(omTrackAddr d_addr)
153 d_addr->track > 2 && d_addr->track <= 5);
154 addr = _omTrackAddr_2_FrontPattern(d_addr);
157 static size_t omTrackAddr_2_SizeOfFrontPattern(omTrackAddr d_addr)
161 d_addr->track > 2 && d_addr->track <= 5);
162 omAssume((
unsigned long) omTrackAddr_2_OutAddr(d_addr) > (
unsigned long) omTrackAddr_2_FrontPattern(d_addr));
163 size = _omTrackAddr_2_SizeOfFrontPattern(d_addr);
167 static char* omTrackAddr_2_BackPattern(omTrackAddr d_addr)
171 d_addr->track > 2 && d_addr->track <= 5);
172 addr = _omTrackAddr_2_BackPattern(d_addr);
173 omAssume(OM_ALIGN_SIZE((
unsigned long) addr) == (
unsigned long) addr);
176 static size_t omTrackAddr_2_SizeOfBackPattern(omTrackAddr d_addr)
180 d_addr->track > 2 && d_addr->track <= 5);
181 size = _omTrackAddr_2_SizeOfBackPattern(d_addr);
185 static size_t omTrack3Addr_2_OutSize(omTrackAddr d_addr)
189 d_addr->track > 2 && d_addr->track <= 5);
193 size = _omTrack3Addr_2_OutSize(d_addr);
196 static size_t omTrackAddr_2_OutSize(omTrackAddr d_addr)
200 d_addr->track > 0 && d_addr->track <= 5);
202 size = _omTrackAddr_2_OutSize(d_addr);
205 static size_t omOutSize_2_TrackAddrSize(
size_t size,
char track)
209 da_size = _omOutSize_2_TrackAddrSize(
size, track);
213 #define omTrackAddr_2_SizeOfTrackAddrHeader _omTrackAddr_2_SizeOfTrackAddrHeader 214 #define omTrackAddr_2_FrontPattern _omTrackAddr_2_FrontPattern 215 #define omTrackAddr_2_BackPattern _omTrackAddr_2_BackPattern 216 #define omTrack3Addr_2_OutSize _omTrack3Addr_2_OutSize 217 #define omTrackAddr_2_OutSize _omTrackAddr_2_OutSize 218 #define omOutSize_2_TrackAddrSize _omOutSize_2_TrackAddrSize 219 #define omTrackAddr_2_SizeOfFrontPattern _omTrackAddr_2_SizeOfFrontPattern 220 #define omTrackAddr_2_SizeOfBackPattern _omTrackAddr_2_SizeOfBackPattern 223 OM_INLINE_LOCAL omTrackAddr omOutAddr_2_TrackAddr(
void* addr)
232 d_addr = (omTrackAddr) ((
unsigned long) page + (
unsigned long) ((((
unsigned long)addr - (
unsigned long)page) /
size)*
size));
236 size_t omOutSizeOfTrackAddr(
void* addr)
238 omTrackAddr d_addr = omOutAddr_2_TrackAddr(addr);
240 return omTrackAddr_2_OutSize(d_addr);
247 return omTrackAddr_2_OutAddr(omOutAddr_2_TrackAddr(addr));
263 static omTrackAddr _omAllocTrackAddr(
size_t d_size)
269 bin = omSmallSize2TrackBin(d_size);
271 bin = omGetSpecTrackBin(d_size);
277 omSetTrackOfUsedBlocks(bin->current_page->used_blocks);
281 void* omAllocTrackAddr(
void* bin_size,
286 (bin_size !=
NULL ? OM_ALIGN_SIZE((
size_t) bin_size) : OM_ALIGN_SIZE(1)));
289 if (track <= 0) track = 1;
290 else if (track > 5) track = 5;
295 track = (track > 3 ? track : 3);
296 d_size = omOutSize_2_TrackAddrSize(o_size, track);
298 d_addr = _omAllocTrackAddr(d_size);
299 d_addr->next = (
void*)-1;
300 d_addr->track = track;
305 #ifdef OM_TRACK_FILE_LINE 306 d_addr->alloc_file =
f;
307 d_addr->alloc_line = (
l > SHRT_MAX ||
l < 0 ? 0 :
l);
309 #ifdef OM_TRACK_RETURN 313 o_addr = omTrackAddr_2_OutAddr(d_addr);
316 #ifdef OM_INTERNAL_DEBUG 317 #define FROM_FRAMES 0 319 #define FROM_FRAMES 2 322 #ifdef OM_TRACK_BACKTRACE 323 omGetBackTrace((
void **)d_addr->alloc_frames, FROM_FRAMES, OM_MAX_KEPT_FRAMES);
330 d_addr->bin_size = (
void*)(((
omBin) bin_size)->sizeW<<LOG_SIZEOF_LONG);
335 d_addr->bin_size = (
flags &
OM_FBIN ? bin_size : (
void*) o_size);
336 omAssume(OM_ALIGN_SIZE((
size_t)d_addr->bin_size) == (
size_t) d_addr->bin_size);
338 memset(omTrackAddr_2_FrontPattern(d_addr), OM_FRONT_PATTERN, omTrackAddr_2_SizeOfFrontPattern(d_addr));
339 if (! (
flags &
OM_FZERO)) memset(o_addr, OM_INIT_PATTERN, o_size);
340 memset(omTrackAddr_2_BackPattern(d_addr), OM_BACK_PATTERN, omTrackAddr_2_SizeOfBackPattern(d_addr));
342 #ifdef OM_TRACK_CUSTOM 343 d_addr->custom =
NULL;
347 #ifdef OM_TRACK_FILE_LINE 348 d_addr->free_line = -1;
349 d_addr->free_file = (
char*) -1;
351 #ifdef OM_TRACK_RETURN 352 d_addr->free_r = (
void*) -1;
355 #ifdef OM_TRACK_BACKTRACE 357 memset(&d_addr->free_frames, 0, OM_MAX_KEPT_FRAMES*SIZEOF_VOIDP);
369 omTrackAddr d_addr = omOutAddr_2_TrackAddr(addr);
372 d_addr->next = (
void*) -1;
373 if (d_addr->track > 2)
377 memset(omTrackAddr_2_OutAddr(d_addr), OM_FREE_PATTERN, omTrackAddr_2_OutSize(d_addr));
378 if (d_addr->track > 3)
380 #ifdef OM_TRACK_FILE_LINE 381 d_addr->free_line =
l;
382 d_addr->free_file =
f;
384 #ifdef OM_TRACK_RETURN 388 #ifdef OM_TRACK_BACKTRACE 389 if (d_addr->track > 4)
390 omGetBackTrace(d_addr->free_frames, FROM_FRAMES, OM_MAX_KEPT_FRAMES);
401 if (keep) d_addr->flags |=
OM_FKEPT;
404 return(
void*) d_addr;
407 void omFreeTrackAddr(
void* d_addr)
414 d_addr = omOutAddr_2_TrackAddr(d_addr);
428 omUnsetTrackOfUsedBlocks(page->used_blocks);
430 om_JustFreedPage =
NULL;
434 if (page != om_JustFreedPage)
435 omSetTrackOfUsedBlocks(page->used_blocks);
454 omTrackAddr d_addr = omOutAddr_2_TrackAddr(addr);
462 level, report, OM_FLR_VAL));
463 return omDoCheckTrackAddr(d_addr, addr, bin_size,
flags,
level, report, OM_FLR_VAL);
483 if (d_addr->track > 2)
496 - omTrackAddr_2_SizeOfTrackAddrHeader(d_addr)
497 - OM_MIN_SIZEOF_BACK_PATTERN);
528 if (d_addr->track > 3)
530 #ifdef OM_TRACK_FILE_LINE 542 #ifdef OM_TRACK_RETURN 544 && (d_addr->free_r != (
void*) -1));
553 size_t size = omTrackAddr_2_OutSize(d_addr);
559 || (
size_t)bin_size > 0))
565 size_t size = omTrackAddr_2_OutSize(d_addr);
580 static int omCheckPattern(
char*
s,
char p,
size_t size)
591 #ifdef OM_TRACK_BACKTRACE 592 #define OM_ALLOC_FRAMES(d_addr) d_addr->alloc_frames 593 #define OM_FREE_FRAMES(d_addr) d_addr->free_frames 595 #define OM_ALLOC_FRAMES(d) NULL 596 #define OM_FREE_FRAMES(d) NULL 599 void omPrintTrackAddrInfo(FILE*
fd,
void* addr,
int max_frames)
601 omTrackAddr d_addr = omOutAddr_2_TrackAddr(addr);
603 if (max_frames <= 0)
return;
606 fputs(
" freed\n",
fd);
610 if (max_frames > OM_MAX_KEPT_FRAMES) max_frames = OM_MAX_KEPT_FRAMES;
612 fputs(
" allocated at ",
fd);
614 (d_addr->track > 1 ? max_frames : 0),
616 OM_FLR_ARG(d_addr->alloc_file, d_addr->alloc_line, d_addr->alloc_r)))
618 if (d_addr->track > 1)
620 if (d_addr->track > 3 && ! (d_addr->flags &
OM_FUSED))
622 fputs(
"\n freed at ",
fd);
624 (d_addr->track > 4 ? max_frames : 0),
626 OM_FLR_ARG(d_addr->free_file, d_addr->free_line, d_addr->free_r)))
641 omTrackAddr d_addr = omOutAddr_2_TrackAddr(addr);
647 omBin omGetOrigSpecBinOfTrackAddr(
void* addr)
649 omTrackAddr d_addr = omOutAddr_2_TrackAddr(addr);
652 if (d_addr->track > 2 && (d_addr->flags &
OM_FBIN))
664 omTrackAddr d_addr = omOutAddr_2_TrackAddr(addr);
673 omTrackAddr d_addr = omOutAddr_2_TrackAddr(addr);
678 static void _omMarkAsStatic(
void* addr)
680 omTrackAddr d_addr = (omTrackAddr) addr;
688 static void _omUnMarkAsStatic(
void* addr)
690 omTrackAddr d_addr = (omTrackAddr) addr;
705 #ifdef OM_TRACK_CUSTOM 706 void omSetCustomOfTrackAddr(
void* addr,
void* value)
708 omTrackAddr d_addr = omOutAddr_2_TrackAddr(addr);
711 if (d_addr->track > 2)
713 d_addr->custom = value;
717 void* omGetCustomOfTrackAddr(
void* addr)
719 omTrackAddr d_addr = omOutAddr_2_TrackAddr(addr);
722 if (d_addr->track > 2)
724 return d_addr->custom;
737 #ifndef OM_HAVE_TRACK 748 addr = omOutAddr_2_TrackAddr(addr);
760 ptr = *((
void**) ptr);
const CanonicalForm int s
omError_t omDoCheckBinAddr(void *addr, void *bin_size, omTrackFlags_t flags, char level, omError_t report, OM_FLR_DECL)
#define omAddrCheckReturnError(cond, error)
#define SIZEOF_OM_BIN_PAGE_HEADER
#define __omTypeAllocBin(type, addr, bin)
void omUnMarkAsStaticAddr(void *addr)
unsigned short omTrackFlags_t
#define omIsStaticTrackBin(bin)
#define omIsStaticTrackAddr(addr)
#define omIsTrackAddr(addr)
#define omDeleteSpecBin(bin_ptr)
#define omCheckReturn(cond)
#define omIsKnownTopBin(bin, normal_bin)
omError_t omCheckPtr(const void *ptr, omError_t report, OM_FLR_DECL)
#define omGetBackTrace(bt, s, max)
int omIsInKeptAddrList(void *addr)
#define omGetBinPageOfAddr(addr)
#define omSizeOfBinAddr(addr)
#define OM_MAX_BLOCK_SIZE
#define omIsStaticNormalBin(bin)
void * omAddr_2_OutAddr(void *addr)
void omIterateTroughAddrs(int normal, int track, void(*CallBackUsed)(void *), void(*CallBackFree)(void *))
#define omMemsetW(P1, W, L)
#define omIsBinPageAddr(addr)
#define __omFreeBinAddr(addr)
int _omPrintBackTrace(void **bt, int max, FILE *fd, OM_FLR_DECL)
void omUnMarkMemoryAsStatic()
void omMarkMemoryAsStatic()
void * om_AlwaysKeptAddrs
void omMarkAsStaticAddr(void *addr)
int status int void size_t count int const void size_t count const char int flags
#define omGetPageOfAddr(addr)
#define omAddrCheckReturnCorrupted(cond)
#define omGetTopBinOfPage(page)