source: git/omalloc/omDebugCheck.c @ 0338ae9

fieker-DuValspielwiese
Last change on this file since 0338ae9 was be127e, checked in by Oleksandr Motsak <motsak@…>, 10 years ago
Omalloc should not reference itself in include pathes
  • Property mode set to 100644
File size: 18.4 KB
RevLine 
[e70e45]1/*******************************************************************
2 *  File:    omDebugCheck.c
3 *  Purpose: implementation of omCheck functions
4 *  Author:  obachman@mathematik.uni-kl.de (Olaf Bachmann)
5 *  Created: 11/99
6 *******************************************************************/
[8d0069]7#include <mylimits.h>
[e70e45]8#include <stdarg.h>
9
[be127e]10#include "omalloc.h"
11#include "omDebug.h"
[e70e45]12
13#ifndef OM_NDEBUG
14/*******************************************************************
[13fe1b]15 *
[e70e45]16 *   Declarations: Static function
[13fe1b]17 *
[e70e45]18 *******************************************************************/
19unsigned long om_MaxAddr = 0;
20unsigned long om_MinAddr = ULONG_MAX;
21static omError_t omDoCheckLargeAddr(void* addr, void* bin_size, omTrackFlags_t flags, char level,
22                                    omError_t report, OM_FLR_DECL);
[13fe1b]23omError_t omDoCheckBin(omBin bin, int normal_bin, char level,
[e70e45]24                       omError_t report, OM_FLR_DECL);
[13fe1b]25static omError_t omDoCheckBinPage(omBinPage page, int normal_page, int level,
[e70e45]26                                  omError_t report, OM_FLR_DECL);
[c0180f]27static void _omPrintAddrInfo(FILE* fd, omError_t error, void* addr, void* bin_size, omTrackFlags_t flags, int max_frames, const char* s);
[e70e45]28
29
30/*******************************************************************
[13fe1b]31 *
32 * First level omCheck routines: dispatch to lower-level omDoCheck
[e70e45]33 * routines which do the actual tests
[13fe1b]34 *
[e70e45]35 *******************************************************************/
[13fe1b]36omError_t _omCheckAddr(void* addr, void* size_bin,
[e70e45]37                       omTrackFlags_t flags, char check, omError_t report, OM_FLR_DECL)
38{
39  if (check <= 0) return omError_NoError;
40  if (check > 1)
41  {
42    omCheckReturn(check > 2 && _omCheckMemory(check - 2, (report ? report : omError_MemoryCorrupted), OM_FLR_VAL));
[13fe1b]43    omCheckReturn(omIsBinPageAddr(addr) && omDoCheckBin(omGetBinOfAddr(addr), !omIsBinAddrTrackAddr(addr), check-1,
[e70e45]44                                                        (report ? report : omError_MemoryCorrupted), OM_FLR_VAL));
45  }
46  return omDoCheckAddr(addr, size_bin, flags, check, report, OM_FLR_VAL);
47}
48
49omError_t _omCheckBin(omBin bin, int what_bin, char check, omError_t report, OM_FLR_DECL)
50{
51  if (check <= 0) return omError_NoError;
52
53  omCheckReturn(check > 1 && _omCheckMemory(check - 1, (report ? report : omError_MemoryCorrupted), OM_FLR_VAL));
54
55  return omDoCheckBin(bin, what_bin, check, report, OM_FLR_VAL);
56}
57
58omError_t _omCheckMemory(char check, omError_t report, OM_FLR_DECL)
59{
60  int i = 0;
61  omSpecBin s_bin;
[f103fb]62  omBin sticky;
[13fe1b]63
[e70e45]64  if (check <= 0) return omError_NoError;
[13fe1b]65
[e70e45]66  omCheckReturn(omCheckBinPageRegions(check, report, OM_FLR_VAL));
[13fe1b]67
[e70e45]68  for (i=0; i<= OM_MAX_BIN_INDEX; i++)
69  {
70    omCheckReturn(omDoCheckBin(&om_StaticBin[i], 1, check, report, OM_FLR_VAL));
71  }
72
73  s_bin = om_SpecBin;
74  omCheckReturn(omCheckGList(s_bin, next, check, omError_MemoryCorrupted, OM_FLR_VAL));
75  while (s_bin != NULL)
76  {
77    omCheckReturn(omDoCheckBin(s_bin->bin, 1, check, report, OM_FLR_VAL));
78    s_bin = s_bin->next;
79  }
80
[f103fb]81  sticky = om_StickyBins;
82  omCheckReturn(omCheckGList(sticky, next, check, omError_MemoryCorrupted, OM_FLR_VAL));
83  while (sticky != NULL)
84  {
85    omCheckReturn(omDoCheckBin(sticky, 1, check, report, OM_FLR_VAL));
86    sticky = sticky->next;
87  }
[13fe1b]88
[e70e45]89#ifdef OM_HAVE_TRACK
90  for (i=0; i<= OM_MAX_BIN_INDEX; i++)
91  {
92    omCheckReturn(omDoCheckBin(&om_StaticTrackBin[i], 0, check, report, OM_FLR_VAL));
93  }
94  s_bin = om_SpecTrackBin;
95  omCheckReturn(omCheckGList(s_bin, next, check, omError_MemoryCorrupted, OM_FLR_VAL));
96  while (s_bin != NULL)
97  {
98    omCheckReturn(omDoCheckBin(s_bin->bin, 0, check, report, OM_FLR_VAL));
99    s_bin = s_bin->next;
100  }
101#endif
[13fe1b]102
[36ee6f]103  if (check > 1)
[e70e45]104  {
[36ee6f]105    if (om_KeptAddr != NULL)
106    {
107      void* addr = om_KeptAddr;
108      omCheckReturn(omCheckList(om_KeptAddr, check - 1, (report ? report :  omError_KeptAddrListCorrupted), OM_FLR_VAL));
109      while (addr != NULL)
110      {
111        omCheckReturn(omDoCheckAddr(addr, NULL, OM_FKEPT, check, report, OM_FLR_VAL));
112        addr = *((void**) addr);
113      }
114    }
115    if (om_AlwaysKeptAddrs != NULL)
[e70e45]116    {
[36ee6f]117      void* addr = om_AlwaysKeptAddrs;
118      omCheckReturn(omCheckList(om_AlwaysKeptAddrs, check - 1, (report ? report :  omError_KeptAddrListCorrupted), OM_FLR_VAL));
119      while (addr != NULL)
120      {
121        omCheckReturn(omDoCheckAddr(addr, NULL, OM_FKEPT, check, report, OM_FLR_VAL));
122        addr = *((void**) addr);
123      }
[e70e45]124    }
125  }
[36ee6f]126
[e70e45]127  return omError_NoError;
128}
129
130/*******************************************************************
[13fe1b]131 *
[e70e45]132 * Second level omCheck routines: do the actual checks
[13fe1b]133 *
[e70e45]134 *******************************************************************/
135
[13fe1b]136omError_t omCheckPtr(const void* ptr, omError_t report, OM_FLR_DECL)
[e70e45]137{
138  omCheckReturnError(ptr == NULL, omError_NullAddr);
139  omCheckReturnError(!OM_IS_ALIGNED(ptr), omError_UnalignedAddr);
[13fe1b]140  omCheckReturnError(((unsigned long) ptr) < om_MinAddr ||
[e70e45]141                     ((unsigned long) ptr) >= om_MaxAddr, omError_InvalidRangeAddr);
142  return omError_NoError;
143}
144
[13fe1b]145
146omError_t omDoCheckAddr(void* addr, void* bin_size, omTrackFlags_t flags, char level,
[e70e45]147                        omError_t report, OM_FLR_DECL)
148{
[fe1e67]149  if (level <= 0) return omError_NoError;
[e70e45]150  omAssume(! ((flags & OM_FSIZE) && (flags & OM_FBIN)));
[13fe1b]151
[e70e45]152  if (addr == NULL)
153  {
154    omCheckReturnError(!(flags & OM_FSLOPPY), omError_NullAddr);
155    return omError_NoError;
156  }
157  if ((flags & OM_FSIZE) && bin_size == NULL) return omError_NoError;
158  omAddrCheckReturn(omCheckPtr(addr, report, OM_FLR_VAL));
159  omAddrCheckReturnError((flags & OM_FALIGN) &&  !OM_IS_STRICT_ALIGNED(addr), omError_UnalignedAddr);
[91c4012]160  omAddrCheckReturnError((flags & OM_FBIN) && !omIsKnownTopBin((omBin) bin_size, 1), omError_UnknownBin);
[13fe1b]161
[e70e45]162  if (omIsBinPageAddr(addr))
163  {
164#ifdef OM_HAVE_TRACK
165    if (omIsBinAddrTrackAddr(addr))
166      return omCheckTrackAddr(addr, bin_size, flags, level, report, OM_FLR_VAL);
167    else
168#endif
169      return omDoCheckBinAddr(addr, bin_size, flags, level, report, OM_FLR_VAL);
170  }
171  else
172  {
173    return omDoCheckLargeAddr(addr, bin_size, flags, level, report, OM_FLR_VAL);
174  }
175}
176
177
178
[13fe1b]179static omError_t omDoCheckLargeAddr(void* addr, void* bin_size, omTrackFlags_t flags, char level,
[e70e45]180                                    omError_t report, OM_FLR_DECL)
181{
182  size_t r_size;
[13fe1b]183
[e70e45]184  omAssume(! omIsBinPageAddr(addr));
185  omAssume(! omCheckPtr(addr, omError_NoError, OM_FLR));
[13fe1b]186
[91c4012]187  omAddrCheckReturnError((flags & OM_FBIN) || (flags & OM_FBINADDR), omError_NotBinAddr);
[e70e45]188  omAddrCheckReturnError(level > 1 && omFindRegionOfAddr(addr) != NULL, omError_FreedAddrOrMemoryCorrupted);
189  r_size = omSizeOfLargeAddr(addr);
190  omAddrCheckReturnError(! OM_IS_ALIGNED(r_size), omError_FalseAddrOrMemoryCorrupted);
191  omAddrCheckReturnError(r_size <= OM_MAX_BLOCK_SIZE, omError_FalseAddrOrMemoryCorrupted);
192  omAddrCheckReturnError((flags & OM_FSIZE) && r_size < OM_ALIGN_SIZE((size_t) bin_size),
193                         omError_WrongSize);
194  omAddrCheckReturnError((level > 1) && (flags & OM_FUSED) && omIsInKeptAddrList(addr), omError_FreedAddr);
195  return omError_NoError;
196}
197
[13fe1b]198omError_t omDoCheckBinAddr(void* addr, void* bin_size, omTrackFlags_t flags, char level,
[e70e45]199                           omError_t report, OM_FLR_DECL)
200{
201  omBinPage page = omGetBinPageOfAddr(addr);
202  omBinPageRegion region = page->region;
203  omBin bin = omGetBinOfPage(page);
[13fe1b]204
[e70e45]205  omAssume(omIsBinPageAddr(addr));
206  omAssume(! omCheckPtr(addr, 0, OM_FLR));
[13fe1b]207
[e70e45]208  omAddrCheckReturnCorrupted(! omIsKnownTopBin(bin, ! omIsBinAddrTrackAddr(addr)));
209
[cba516]210  if (flags & OM_FBINADDR && flags & OM_FSIZE)
211    omAddrCheckReturnError(bin->sizeW*SIZEOF_LONG != (size_t) bin_size, omError_WrongSize);
[13fe1b]212
[e70e45]213  if (level > 1)
214  {
215    omAddrCheckReturnError(omIsAddrOnFreeBinPage(addr), omError_FreedAddr);
216    omAddrCheckReturnError(omFindRegionOfAddr(addr) != region, omError_FreedAddrOrMemoryCorrupted);
217    omAddrCheckReturnError(!omIsOnGList(bin->last_page, prev, page), omError_FreedAddrOrMemoryCorrupted);
218
219    if (flags & OM_FUSED)
220    {
221      omAddrCheckReturnError(omIsOnList(page->current, addr), omError_FreedAddr);
222      omAddrCheckReturnError((level > 1) && omIsInKeptAddrList(addr), omError_FreedAddr);
223    }
224  }
225  else
226  {
227    omAddrCheckReturnError(omCheckPtr(region, omError_MaxError, OM_FLR_VAL), omError_FreedAddrOrMemoryCorrupted);
228  }
[13fe1b]229
230
[e70e45]231  /* Check that addr is aligned within page of bin */
232  omAddrCheckReturnError((bin->max_blocks >= 1) &&
[13fe1b]233                         ( ( ( (unsigned long) addr)
234                             - ((unsigned long) page)
235                             - SIZEOF_OM_BIN_PAGE_HEADER)
[e70e45]236                           % (bin->sizeW * SIZEOF_VOIDP)
237                           != 0), omError_FalseAddr);
238
239  /* Check that specified bin or size is correct */
[13fe1b]240  omAddrCheckReturnError((flags & OM_FBIN) &&  bin_size != NULL
[e70e45]241                         && ((omBin) bin_size) != omGetTopBinOfAddr(addr), omError_WrongBin);
242
[f103fb]243  if ((flags & OM_FSIZE) && (!(flags & OM_FSLOPPY)  || (size_t) bin_size > 0))
[e70e45]244  {
245    size_t size = (size_t) bin_size;
246    omAssume(!omIsBinAddrTrackAddr(addr));
247    omAddrCheckReturnError((bin->sizeW << LOG_SIZEOF_LONG) < OM_ALIGN_SIZE(size), omError_WrongSize);
248  }
249
250  return omError_NoError;
251}
252
[13fe1b]253omError_t omDoCheckBin(omBin bin, int normal_bin, char level,
[e70e45]254                       omError_t report, OM_FLR_DECL)
255{
256  omBin top_bin = bin;
[13fe1b]257
[e70e45]258  omCheckReturnError(!omIsKnownTopBin(bin, normal_bin), omError_UnknownBin);
[f103fb]259  if (! omIsStickyBin(bin))
260    omCheckReturn(omCheckGList(bin->next, next, level, report, OM_FLR_VAL));
[13fe1b]261
[e70e45]262  do
263  {
264    int where;
265    omBinPage page;
266
267    if (bin->last_page == NULL || bin->current_page == om_ZeroPage)
268    {
269      omCheckReturnCorrupted(! (bin->current_page == om_ZeroPage && bin->last_page == NULL));
270      continue;
271    }
272    omCheckReturn(omDoCheckBinPage(bin->current_page, normal_bin, level, report, OM_FLR_VAL));
[13fe1b]273    omCheckReturn(bin->current_page != bin->last_page  &&
[e70e45]274                  omDoCheckBinPage(bin->last_page, normal_bin, level, report, OM_FLR_VAL));
275    omCheckReturnCorrupted(bin->last_page->next != NULL);
276
277    if (bin != top_bin)
278    {
279      omCheckReturnCorrupted(bin->sizeW != top_bin->sizeW ||
280                             bin->max_blocks != top_bin->max_blocks);
281    }
282    if (level <= 1) continue;
[13fe1b]283
[f103fb]284    if (! omIsStickyBin(bin))
285      omCheckReturnCorrupted(omFindInGList(bin->next, next, sticky, bin->sticky));
[e70e45]286    omCheckReturn(omCheckGList(bin->last_page, prev, level-1, report, OM_FLR_VAL));
287    page = omGListLast(bin->last_page, prev);
288    omCheckReturn(omCheckGList(page, next, level-1, report, OM_FLR_VAL));
289    omCheckReturnCorrupted(omGListLength(bin->last_page, prev) != omGListLength(page, next));
[13fe1b]290
[e70e45]291    omCheckReturnCorrupted(! omIsOnGList(bin->last_page, prev, bin->current_page));
[13fe1b]292
[e70e45]293    page = bin->last_page;
294    where = 1;
295    while (page != NULL)
296    {
297      omCheckReturnCorrupted(omGetTopBinOfPage(page) != top_bin);
298      omCheckReturn(page != bin->last_page && page != bin->current_page &&
299                    omDoCheckBinPage(page, normal_bin, level - 1, report, OM_FLR_VAL));
300
[13fe1b]301      omCheckReturnCorrupted(page != bin->last_page &&
[e70e45]302                             (page->next == NULL || page->next->prev != page));
303      omCheckReturnCorrupted(page->prev != NULL && page->prev->next != page);
[13fe1b]304
[f103fb]305      omCheckReturnCorrupted(omGetStickyOfPage(page) != bin->sticky && bin->sticky < SIZEOF_VOIDP);
[e70e45]306      omCheckReturnCorrupted(omGetBinOfPage(page) != bin);
[13fe1b]307
[f103fb]308      if (where == -1)
309      {
310        /* we are at the left of current_page,
311           i.e., page is empty */
312        omCheckReturnCorrupted(omGetUsedBlocksOfPage(page) != 0 || page->current != NULL);
313      }
314      else
[e70e45]315      {
[f103fb]316        if (page == bin->current_page)
[e70e45]317        {
[f103fb]318          where = -1;
[e70e45]319        }
320        else
321        {
[13fe1b]322          /* we are at the right of current_page,
[f103fb]323             i.e., page is neither full nor empty */
324          omCheckReturnCorrupted(page->current == NULL ||
325                                 omGetUsedBlocksOfPage(page) == bin->max_blocks - 1);
[e70e45]326        }
327      }
328      page = page->prev;
329    }   /* while (page != NULL) */
[f103fb]330  } while (!omIsStickyBin(bin) && ((bin = bin->next) != NULL));
[13fe1b]331
[e70e45]332  return omError_NoError;
333}
334
[13fe1b]335
336static omError_t omDoCheckBinPage(omBinPage page, int normal_page, int level,
[e70e45]337                                  omError_t report, OM_FLR_DECL)
338{
339  omBin bin;
[13fe1b]340
[e70e45]341  omCheckReturn(omCheckPtr(page, report, OM_FLR_VAL));
342  omCheckReturnCorrupted(! omIsAddrPageAligned(page));
343
344  omCheckReturn(omCheckPtr(page->region, report, OM_FLR_VAL));
345  omCheckReturnCorrupted(level > 1 && omFindRegionOfAddr(page) != page->region);
346
[13fe1b]347
[e70e45]348#ifdef OM_HAVE_TRACK
349  if (! normal_page)
350  {
351    omCheckReturnCorrupted(! omIsSetTrackOfUsedBlocks(page->used_blocks));
352  }
353  else
354#endif
355    omAssume(normal_page);
[13fe1b]356
[e70e45]357  bin = omGetTopBinOfPage(page);
358  if (bin->max_blocks > 1)
359  {
360    omCheckReturnCorrupted(omGetUsedBlocksOfPage(page) > bin->max_blocks - 1);
[13fe1b]361    omCheckReturnCorrupted(omGetUsedBlocksOfPage(page) == bin->max_blocks - 1 &&
[e70e45]362                           page->current != NULL);
363    omCheckReturnCorrupted(omGetUsedBlocksOfPage(page) < 0);
364  }
365  else
366  {
367    omCheckReturnCorrupted(omGetUsedBlocksOfPage(page) != 0);
368  }
[13fe1b]369
[e70e45]370  omCheckReturn(omCheckList(page->current, level, report, OM_FLR_VAL));
371
372  if (level > 1)
373  {
374    void* current = page->current;
375
376    omCheckReturnCorrupted(current != NULL &&
377                           omListLength(current) != bin->max_blocks - omGetUsedBlocksOfPage(page) - 1);
[13fe1b]378
[e70e45]379    while (current != NULL)
380    {
381      omCheckReturnCorrupted(omGetPageOfAddr(current) != page);
[13fe1b]382
383      omCheckReturnCorrupted( ( ( (unsigned long) current)
384                                - ((unsigned long) page)
385                                - SIZEOF_OM_BIN_PAGE_HEADER)
[e70e45]386                              % (bin->sizeW * SIZEOF_LONG)
387                              != 0);
388      current = *((void**) current);
389    }
390  }
391  return omError_NoError;
392}
393
[13fe1b]394omError_t omReportAddrError(omError_t error, omError_t report_error, void* addr, void* bin_size, omTrackFlags_t flags,
395                            OM_FLR_DECL, const char* fmt, ...)
[e70e45]396{
[fe1e67]397  int max_check, max_track;
[e70e45]398  va_list ap;
399  va_start(ap, fmt);
[13fe1b]400
[fe1e67]401  /* reset MaxTrack and MaxCheck to prevent infinite loop, in case
402     printf allocates memory */
403  max_check = om_Opts.MaxCheck;
404  max_track = om_Opts.MaxTrack;
405  om_Opts.MaxCheck = 0;
406  om_Opts.MaxTrack = 0;
[13fe1b]407
[36ee6f]408  om_CallErrorHook = 0;
[e70e45]409  omReportError(error, report_error, OM_FLR_VAL, fmt, ap);
[36ee6f]410  om_CallErrorHook = 1;
[13fe1b]411
[36ee6f]412  _omPrintAddrInfo(stderr, error, addr, bin_size, flags, 10, " occured for");
413  om_Opts.ErrorHook();
[13fe1b]414
[fe1e67]415  om_Opts.MaxCheck = max_check;
416  om_Opts.MaxTrack = max_track;
[e70e45]417  return om_ErrorStatus;
418}
419
[c0180f]420void _omPrintAddrInfo(FILE* fd, omError_t error, void* addr, void* bin_size, omTrackFlags_t flags, int frames, const char* s)
[e70e45]421{
[66083e]422  int x;
423  if (! (x=omCheckPtr(addr, omError_MaxError, OM_FLR)))
[e70e45]424  {
[657747]425    fprintf(fd, "%s addr:%p size:%ld", s, addr, (long)omSizeOfAddr(addr));
[13fe1b]426
[e70e45]427  if (error == omError_WrongSize && (flags & OM_FSIZE))
[657747]428    fprintf(fd, " specified size:%ld", (long) bin_size);
[13fe1b]429
[e70e45]430  if (error == omError_WrongBin && (flags & OM_FBIN))
[657747]431    fprintf(fd, " specified bin is of size:%ld",
432                 (long)((omBin) bin_size)->sizeW << LOG_SIZEOF_LONG);
[13fe1b]433
434  if (omIsTrackAddr(addr))
[36ee6f]435    omPrintTrackAddrInfo(fd, addr, frames);
[e70e45]436  else
437    fprintf(fd, "\n");
438  }
439  else
440  {
[66083e]441    fprintf(fd, "%s (invalid) addr: %p (error=%d)\n", s, addr,x);
[e70e45]442  }
443}
444
[c0180f]445void omPrintAddrInfo(FILE* fd, void *addr, const char* s)
[cba516]446{
[36ee6f]447  _omPrintAddrInfo(fd, omError_NoError, addr, NULL, 0, 10, s);
[cba516]448}
449
[e70e45]450/*******************************************************************
[13fe1b]451 *
[e70e45]452 * Misc for iterating, etc.
[13fe1b]453 *
[e70e45]454 *******************************************************************/
455
456void omIterateTroughBinAddrs(omBin bin, void (*CallBackUsed)(void*), void (*CallBackFree)(void*))
457{
458  omBinPage page;
[13fe1b]459  char* addr;
[36ee6f]460  int is_free;
[e70e45]461  int i;
[13fe1b]462
[e70e45]463  do
464  {
465    page = bin->last_page;
466    while (page != NULL)
467    {
[13fe1b]468      addr = (char*) page + SIZEOF_OM_BIN_PAGE_HEADER;
[e70e45]469      i = 0;
470      do
471      {
[13fe1b]472        is_free = omIsOnList(page->current, addr) != NULL
473                  || omIsInKeptAddrList(addr);
[e70e45]474        if (is_free)
475        {
476          if (CallBackFree != NULL) CallBackFree(addr);
477        }
[13fe1b]478        else
[e70e45]479        {
480          if (CallBackUsed != NULL) CallBackUsed(addr);
481        }
[13fe1b]482        addr = (char *)((char**) addr) + bin->sizeW;
[e70e45]483        i++;
484      } while (i < bin->max_blocks);
485      page = page->prev;
486    }
[f103fb]487    if (omIsStickyBin(bin))
488      bin = NULL;
[13fe1b]489    else
[f103fb]490      bin = bin->next;
[e70e45]491  } while (bin != NULL);
[13fe1b]492
[e70e45]493}
494
495void omIterateTroughAddrs(int normal, int track, void (*CallBackUsed)(void*), void (*CallBackFree)(void*))
496{
497  int i;
498  omSpecBin s_bin;
[f103fb]499  omBin sticky;
[e70e45]500
501  if (normal)
502  {
503    for (i=0; i<=OM_MAX_BIN_INDEX; i++)
504    {
505      omIterateTroughBinAddrs(&om_StaticBin[i], CallBackUsed, CallBackFree);
506    }
507    s_bin = om_SpecBin;
508    while (s_bin != NULL)
509    {
510      omIterateTroughBinAddrs(s_bin->bin, CallBackUsed, CallBackFree);
511      s_bin = s_bin->next;
512    }
513  }
[13fe1b]514
[e70e45]515#ifdef OM_HAVE_TRACK
516  if (track)
517  {
518    for (i=0; i<=OM_MAX_BIN_INDEX; i++)
519    {
520      omIterateTroughBinAddrs(&om_StaticTrackBin[i], CallBackUsed, CallBackFree);
521    }
522    s_bin = om_SpecTrackBin;
523    while (s_bin != NULL)
524    {
525      omIterateTroughBinAddrs(s_bin->bin, CallBackUsed, CallBackFree);
526      s_bin = s_bin->next;
527    }
528  }
529#endif
[f103fb]530  sticky = om_StickyBins;
531  while (sticky != NULL)
532  {
533    omIterateTroughBinAddrs(sticky, CallBackUsed, CallBackFree);
534    sticky = sticky->next;
535  }
[e70e45]536}
537
538static FILE* om_print_used_addr_fd;
539static size_t om_total_used_size;
[384936]540static unsigned long om_total_used_blocks;
[36ee6f]541static int om_print_frames;
[e70e45]542
543static void _omPrintUsedAddr(void* addr)
544{
545  if (!omIsTrackAddr(addr) || !omIsStaticTrackAddr(addr))
546  {
547    om_total_used_blocks++;
548    om_total_used_size += omSizeOfAddr(addr);
[36ee6f]549    if (om_print_frames > 0)
550    {
551      _omPrintAddrInfo(om_print_used_addr_fd, omError_NoError, addr, NULL, 0, om_print_frames, "");
552      fprintf(om_print_used_addr_fd, "\n");
553    }
[e70e45]554  }
555}
556
[36ee6f]557void omPrintUsedAddrs(FILE* fd, int max)
[e70e45]558{
559  om_total_used_size = 0;
560  om_total_used_blocks = 0;
561  om_print_used_addr_fd = (fd == NULL ? stdout : fd);
[36ee6f]562  om_print_frames = max;
[e70e45]563  omIterateTroughAddrs(1, 1, _omPrintUsedAddr, NULL);
[13fe1b]564  fprintf(fd, "UsedAddrs Summary: UsedBlocks:%ld  TotalSize:%ld\n",
[657747]565          om_total_used_blocks, (long)om_total_used_size);
[e70e45]566}
567
[36ee6f]568void omPrintUsedTrackAddrs(FILE* fd, int max)
[e70e45]569{
570  om_total_used_size = 0;
571  om_total_used_blocks = 0;
572  om_print_used_addr_fd = (fd == NULL ? stdout : fd);
[36ee6f]573  om_print_frames = max;
[e70e45]574  omIterateTroughAddrs(0, 1 ,  _omPrintUsedAddr, NULL);
[13fe1b]575  fprintf(fd, "UsedTrackAddrs Summary: UsedBlocks:%ld  TotalSize:%ld\n",
[657747]576          om_total_used_blocks, (long)om_total_used_size);
[e70e45]577}
578#endif /* ! OM_NDEBUG */
Note: See TracBrowser for help on using the repository browser.