source: git/omalloc/omDebug.c @ d011a2

spielwiese
Last change on this file since d011a2 was 66083e, checked in by Hans Schönemann <hannes@…>, 22 years ago
*hannes: V-2-0-3, copying version stuff git-svn-id: file:///usr/local/Singular/svn/trunk@5797 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 17.1 KB
Line 
1/*******************************************************************
2 *  File:    omTest.c
3 *  Purpose: implementation of main omTest functions
4 *  Author:  obachman@mathematik.uni-kl.de (Olaf Bachmann)
5 *  Created: 7/00
6 *  Version: $Id: omDebug.c,v 1.17 2002-01-22 16:17:41 Singular Exp $
7 *******************************************************************/
8#include <mylimits.h>
9#include <string.h>
10#include "omConfig.h"
11#include "om_Alloc.h"
12#include "omDebug.h"
13#include "omReturn.h"
14
15#ifndef OM_NDEBUG
16/*******************************************************************
17 *
18 * Declarations
19 *
20 *******************************************************************/
21
22static void* __omDebugAlloc(void* size_bin, omTrackFlags_t  flags, char track, OM_FLR_DECL);
23static void* __omDebugRealloc(void* old_addr, void* old_size_bin, void* new_size_bin,
24                              omError_t old_status, omTrackFlags_t  old_flags,
25                              omTrackFlags_t  new_flags,
26                              char track, OM_FLR_DECL);
27static void __omDebugFree(void* addr, void* size_bin, omTrackFlags_t  flags, OM_FLR_DECL);
28
29void* om_KeptAddr = NULL;
30static unsigned long om_NumberOfKeptAddrs = 0;
31void* om_LastKeptAddr = NULL;
32void* om_AlwaysKeptAddrs = NULL;
33
34
35/*******************************************************************
36 *
37 * Test routines
38 *
39 *******************************************************************/
40#define OM_CLFL check_level OM_FL_KOMMA OM_FL
41omError_t omTestAddrBin(void* addr, omBin bin, int check_level)
42{
43  return _omDebugAddr(addr,bin,OM_FBIN,OM_CLFL);
44}
45omError_t omTestBinAddrSize(void* addr, size_t size, int check_level)
46{
47  return _omDebugAddr(addr,(void*)(size),OM_FSIZE|OM_FBINADDR,OM_CLFL);
48}
49omError_t omTestAddrSize(void* addr, size_t size, int check_level)
50{
51  return _omDebugAddr(addr,(void*)(size),OM_FSIZE,OM_CLFL);
52}
53omError_t omTestBinAddr(void* addr, int check_level)
54{
55  return _omDebugAddr(addr,NULL, OM_FBINADDR, OM_CLFL);
56}
57omError_t omTestAddr(void* addr, int check_level)
58{
59  return _omDebugAddr(addr,NULL, 0, OM_CLFL);
60}
61omError_t omtestAddrSize(void* addr, size_t size, int check_level)
62{
63  return _omDebugAddr(addr,(void*)(size),OM_FSIZE|OM_FSLOPPY,OM_CLFL);
64}
65omError_t omtestAddr(void* addr, int check_level)
66{
67  return _omDebugAddr(addr,NULL, OM_FSLOPPY, OM_CLFL);
68}
69
70omError_t omTestAddrAlignedBin(void* addr, omBin bin, int check_level)
71{
72  return _omDebugAddr(addr,bin,OM_FBIN|OM_FALIGN,OM_CLFL);
73}
74omError_t omTestAddrAlignedSize(void* addr, size_t size, int check_level)
75{
76  return _omDebugAddr(addr,(void*)(size),OM_FSIZE|OM_FALIGN,OM_CLFL);
77}
78omError_t omTestAddrAligned(void* addr, int check_level)
79{
80  return _omDebugAddr(addr,NULL, OM_FALIGN, OM_CLFL);
81}
82omError_t omtestAddrAlignedSize(void* addr, size_t size, int check_level)
83{
84  return _omDebugAddr(addr,(void*)(size),OM_FSIZE|OM_FSLOPPY|OM_FALIGN,OM_CLFL);
85}
86omError_t omtestAddrAligned(void* addr, int check_level)
87{
88  return _omDebugAddr(addr,NULL, OM_FSLOPPY|OM_FALIGN, OM_CLFL);
89}
90
91omError_t omTestBin(omBin bin, int check_level)
92{
93  return _omDebugBin(bin, OM_CLFL);
94}
95omError_t omTestMemory(int check_level)
96{
97  return _omDebugMemory(OM_CLFL);
98}
99
100#undef MAX
101#define MAX(a,b) (a > b ? a : b)
102#undef MIN
103#define MIN(a,b) (a < b ? a : b)
104
105/*******************************************************************
106 *
107 * First level _omDebug alloc/free routines: call respective checks and dispatch
108 * to routines which do the actual work
109 *
110 *******************************************************************/
111void* _omDebugAlloc(void* size_bin, omTrackFlags_t flags, OM_CTFL_DECL)
112{
113  void* addr;
114  OM_R_DEF;
115  check = MAX(check, om_Opts.MinCheck);
116  track = MAX(track, om_Opts.MinTrack);
117  check = MIN(check, om_Opts.MaxCheck);
118  track = MIN(track, om_Opts.MaxTrack);
119
120  if (check)
121  {
122    if (check > 1)
123    {
124      if (flags & OM_FBIN)
125        (void) _omCheckBin((omBin)size_bin, 1, check-1, omError_MemoryCorrupted, OM_FLR_VAL);
126      else if (check > 2)
127      {
128        omAssume(flags & OM_FSIZE);
129        (void) _omCheckMemory(check-2, omError_MemoryCorrupted, OM_FLR_VAL);
130      }
131    }
132    if (size_bin == NULL && ! (flags & OM_FSLOPPY))
133    {
134      omReportError(omError_NullSizeAlloc, omError_NoError, OM_FLR_VAL, "");
135    }
136  }
137
138  addr = __omDebugAlloc(size_bin, flags, track, OM_FLR_VAL);
139
140#ifdef OM_INTERNAL_DEBUG
141  (void) _omCheckAddr(addr, size_bin,flags|OM_FUSED,check, omError_InternalBug, OM_FLR);
142#endif
143
144  return addr;
145}
146
147
148void* _omDebugRealloc(void* old_addr, void* old_size_bin, void* new_size_bin,
149                      omTrackFlags_t old_flags, omTrackFlags_t new_flags, OM_CTFL_DECL)
150{
151  void* new_addr = NULL;
152  omError_t status = omError_NoError;
153  OM_R_DEF;
154  check = MAX(check, om_Opts.MinCheck);
155  track = MAX(track, om_Opts.MinTrack);
156  check = MIN(check, om_Opts.MaxCheck);
157  track = MIN(track, om_Opts.MaxTrack);
158
159  if (check)
160  {
161    status = _omCheckAddr(old_addr, old_size_bin, old_flags|OM_FUSED, check, omError_NoError, OM_FLR_VAL);
162
163    if (status == omError_NoError && check > 1 && new_flags & OM_FBIN)
164      status = omDoCheckBin((omBin)new_size_bin, 1, check-1, omError_MemoryCorrupted, OM_FLR_VAL);
165
166    if (new_size_bin == NULL && !(new_flags & OM_FSLOPPY))
167    {
168      omReportError(omError_NullSizeAlloc, omError_NoError, OM_FLR_VAL, "");
169      new_size_bin = (void*) 1;
170    }
171  }
172
173  new_addr = __omDebugRealloc(old_addr, old_size_bin, new_size_bin,
174                              status, old_flags, new_flags, track, OM_FLR_VAL);
175#ifdef OM_INTERNAL_DEBUG
176  if (status == omError_NoError)
177    (void) _omCheckAddr(new_addr, new_size_bin,new_flags|OM_FUSED,check, omError_InternalBug, OM_FLR);
178#endif
179
180  return new_addr;
181}
182
183void _omDebugFree(void* addr, void* size_bin,
184                  omTrackFlags_t flags, OM_CFL_DECL)
185{
186  OM_R_DEF;
187  check = MAX(check, om_Opts.MinCheck);
188  check = MIN(check, om_Opts.MaxCheck);
189
190  if (check && _omCheckAddr(addr, size_bin, flags|OM_FUSED, check, omError_NoError, OM_FLR_VAL)) return;
191
192  __omDebugFree(addr,size_bin,flags, OM_FLR_VAL);
193
194#ifdef OM_INTERNAL_DEBUG
195  if (flags & OM_FBIN)
196    (void) _omCheckBin((omBin)size_bin, 1, check-1,omError_InternalBug, OM_FLR);
197  else
198    (void) _omCheckMemory(check-2,omError_InternalBug,OM_FLR);
199#endif
200}
201
202void* _omDebugMemDup(void* addr, omTrackFlags_t flags, OM_CTFL_DECL)
203{
204  void* ret;
205  size_t sizeW;
206  OM_R_DEF;
207
208  check = MAX(check, om_Opts.MinCheck);
209  track = MAX(track, om_Opts.MinTrack);
210  check = MIN(check, om_Opts.MaxCheck);
211  track = MIN(track, om_Opts.MaxTrack);
212
213  if (check & _omCheckAddr(addr, 0, OM_FUSED, check, omError_NoError, OM_FLR_VAL))
214  {
215    return NULL;
216  }
217  else
218  {
219    sizeW = omSizeWOfAddr(addr);
220  }
221
222  ret = __omDebugAlloc((void*) (sizeW << LOG_SIZEOF_LONG), OM_FSIZE | flags, track, OM_FLR_VAL);
223  omMemcpyW(ret, addr, sizeW);
224
225#ifdef OM_INTERNAL_DEBUG
226  (void) _omCheckAddr(ret, (void*) (sizeW << LOG_SIZEOF_LONG),OM_FUSED|OM_FSIZE,
227                     check, omError_InternalBug, OM_FLR);
228#endif
229  return ret;
230}
231
232char* _omDebugStrDup(const char* addr, OM_TFL_DECL)
233{
234#if 0
235  unsigned long size;
236#endif
237  unsigned long i=0;
238  char* ret;
239  OM_R_DEF;
240
241  if (addr == NULL)
242  {
243    omReportAddrError(omError_NotString, omError_NoError, (char *)addr, 0, 0, OM_FLR_VAL, "NULL String");
244    return NULL;
245  }
246  track = MAX(track, om_Opts.MinTrack);
247  track = MIN(track, om_Opts.MaxTrack);
248
249#if 0
250  // this breaks if SizeOfAddr(addr) > PAGESIZE
251  if (omIsBinPageAddr(addr))
252  {
253    size = omSizeOfAddr(addr);
254  }
255  else
256  {
257    size = ULONG_MAX;
258  }
259#endif
260  while ((addr[i] != '\0') /* && (i < size)*/) i++;
261// there seems to be no way to check if it is really a string
262#if 0
263  if (i == size)
264  {
265    omReportAddrError(omError_NotString, omError_NoError, addr, 0, 0, OM_FLR_VAL, "Not 0 terminated");
266    i = size-1;
267  }
268#endif
269  ret = __omDebugAlloc((char*)i+1, OM_FSIZE, track, OM_FLR_VAL);
270  memcpy(ret, addr, i);
271  ret[i] = '\0';
272
273#ifdef OM_INTERNAL_DEBUG
274  (void) _omCheckAddr(ret, (void*)i+1,OM_FUSED|OM_FSIZE,om_Opts.MinCheck, omError_InternalBug, OM_FLR);
275#endif
276  return ret;
277}
278
279omError_t _omDebugAddr(void* addr, void* bin_size, omTrackFlags_t flags, OM_CFL_DECL)
280{
281  OM_R_DEF;
282  check = MAX(check,om_Opts.MinCheck);
283  check = MIN(check,om_Opts.MaxCheck);
284  return _omCheckAddr(addr, bin_size,
285                      OM_FUSED|flags,check,omError_NoError,OM_FLR_VAL);
286}
287omError_t _omDebugMemory(OM_CFL_DECL)
288{
289  OM_R_DEF;
290  check = MAX(check,om_Opts.MinCheck);
291  check = MIN(check,om_Opts.MaxCheck);
292  return _omCheckMemory(check, omError_NoError,OM_FLR_VAL);
293}
294omError_t _omDebugBin(omBin bin, OM_CFL_DECL)
295{
296  OM_R_DEF;
297  return _omCheckBin(bin, 1, MAX(check, om_Opts.MinCheck), omError_NoError,OM_FLR_VAL);
298}
299
300/*******************************************************************
301 *
302 * Second level _omDebug alloc/free routines: do the actual work
303 *
304 *******************************************************************/
305static void* __omDebugAlloc(void* size_bin, omTrackFlags_t flags, char track, OM_FLR_DECL)
306{
307  void* o_addr;
308  size_t o_size = (flags & OM_FBIN ? ((omBin)size_bin)->sizeW << LOG_SIZEOF_LONG : (size_bin != NULL ? (size_t) size_bin: 1));
309
310#ifdef OM_HAVE_TRACK
311  if (track > 0)
312  {
313    o_addr = omAllocTrackAddr(size_bin, flags, track, OM_FLR_VAL);
314  }
315  else
316#endif
317  {
318    if (flags & OM_FBIN)
319    {
320      omBin bin = (omBin) size_bin;
321
322      if (flags & OM_FZERO)
323        __omTypeAlloc0Bin(void*, o_addr, bin);
324      else
325        __omTypeAllocBin(void*, o_addr, bin);
326    }
327    else
328    {
329      if (flags & OM_FZERO)
330      {
331#ifdef OM_ALIGNMENT_NEEDS_WORK
332        if (flags & OM_FALIGN)
333          __omTypeAlloc0Aligned(void*, o_addr, o_size);
334        else
335#endif
336          __omTypeAlloc0(void*, o_addr, o_size);
337      }
338      else
339      {
340#ifdef OM_ALIGNMENT_NEEDS_WORK
341        if (flags & OM_FALIGN)
342          __omTypeAllocAligned(void*, o_addr, o_size);
343        else
344#endif
345          __omTypeAlloc(void*, o_addr, o_size);
346      }
347    }
348  }
349
350  return o_addr;
351}
352
353static void* __omDebugRealloc(void* old_addr, void* old_size_bin, void* new_size_bin,
354                              omError_t old_status, omTrackFlags_t  old_flags, omTrackFlags_t  new_flags,
355                              char track, OM_FLR_DECL)
356{
357  void* new_addr;
358  size_t old_size = (old_flags & OM_FSIZE ? (size_t) old_size_bin :
359                     (omSizeOfAddr(old_addr)));
360  size_t new_size;
361
362  omAssume(new_flags & OM_FSIZE || new_flags & OM_FBIN);
363
364  if (old_addr == NULL || ((old_flags & OM_FSIZE) && old_size_bin == NULL))
365  {
366    new_addr = __omDebugAlloc(new_size_bin, new_flags, track, OM_FLR_VAL);
367  }
368  else if (om_Opts.Keep > 0 || track > 0 || omIsTrackAddr(old_addr) || old_status != omError_NoError ||
369           old_flags & OM_FKEEP || new_flags & OM_FKEEP)
370  {
371    new_addr = __omDebugAlloc(new_size_bin, new_flags, track, OM_FLR_VAL);
372    new_size =  omSizeOfAddr(new_addr);
373    old_size = omSizeOfAddr(old_addr);
374
375    memcpy(new_addr, old_addr, (old_size < new_size ? old_size : new_size));
376
377    if ((new_flags & OM_FZERO) && new_size > old_size)
378      memset((char *)new_addr + old_size, 0, new_size - old_size);
379    if (old_status == omError_NoError)
380      __omDebugFree(old_addr, old_size_bin, old_flags, OM_FLR_VAL);
381  }
382  else
383  {
384    if (new_flags & OM_FBIN)
385    {
386      omBin new_bin = (omBin) new_size_bin;
387      omBin old_bin = (omBin) old_size_bin;
388
389      omAssume(old_flags & OM_FBIN);
390      if (new_flags & OM_FZERO)
391        __omTypeRealloc0Bin(old_addr, old_bin, void*, new_addr, new_bin);
392      else
393        __omTypeReallocBin(old_addr, old_bin, void*, new_addr, new_bin);
394    }
395    else
396    {
397      new_size = (size_t) new_size_bin;
398      if (new_size == 0) new_size = 1;
399      omAssume(!(new_flags & OM_FBIN) && !(old_flags & OM_FBIN));
400
401      if (old_flags & OM_FSIZE)
402      {
403        size_t old_size = (size_t) old_size_bin;
404
405        if (new_flags & OM_FZERO)
406        {
407#ifdef OM_ALIGNMENT_NEEDS_WORK
408          if (new_flags & OM_FALIGN)
409            __omTypeRealloc0AlignedSize(old_addr, old_size, void*, new_addr, new_size);
410          else
411#endif
412            __omTypeRealloc0Size(old_addr, old_size, void*, new_addr, new_size);
413        }
414        else
415        {
416#ifdef OM_ALIGNMENT_NEEDS_WORK
417          if (new_flags & OM_FALIGN)
418            __omTypeReallocAlignedSize(old_addr, old_size, void*, new_addr, new_size);
419          else
420#endif
421            __omTypeReallocSize(old_addr, old_size, void*, new_addr, new_size);
422        }
423      }
424      else
425      {
426        if (new_flags & OM_FZERO)
427        {
428#ifdef OM_ALIGNMENT_NEEDS_WORK
429          if (new_flags & OM_FALIGN)
430            __omTypeRealloc0Aligned(old_addr, void*, new_addr, new_size);
431          else
432#endif
433            __omTypeRealloc0(old_addr, void*, new_addr, new_size);
434        }
435        else
436        {
437#ifdef OM_ALIGNMENT_NEEDS_WORK
438          if (new_flags & OM_FALIGN)
439            __omTypeReallocAligned(old_addr, void*, new_addr, new_size);
440          else
441#endif
442            __omTypeRealloc(old_addr, void*, new_addr, new_size);
443        }
444      }
445    }
446  }
447  return new_addr;
448}
449
450static omBin omGetOrigSpecBinOfAddr(void* addr)
451{
452  if (omIsBinPageAddr(addr))
453  {
454#ifdef OM_HAVE_TRACK
455    if (omIsBinAddrTrackAddr(addr)) return omGetOrigSpecBinOfTrackAddr(addr);
456    else
457#endif
458    {
459      omBin bin = omGetTopBinOfAddr(addr);
460      if (omIsSpecBin(bin)) return bin;
461    }
462  }
463  return NULL;
464}
465
466static void __omDebugFree(void* addr, void* size_bin, omTrackFlags_t flags, OM_FLR_DECL)
467{
468  omBin bin = NULL;
469
470  if (addr == NULL || ((flags & OM_FSIZE) && size_bin == NULL)) return;
471  if (om_Opts.Keep > 0)
472  {
473#ifdef OM_HAVE_TRACK
474    if (omIsTrackAddr(addr))
475      addr = omMarkAsFreeTrackAddr(addr, 1, &flags, OM_FLR_VAL);
476#endif
477    bin = omGetOrigSpecBinOfAddr(addr);
478    if (bin != NULL)
479    {
480      omSpecBin s_bin = omFindInGList(om_SpecBin, next, bin, (unsigned long) bin);
481      omAssume(s_bin != NULL);
482      (s_bin->ref)++;
483    }
484
485    if (flags & OM_FKEEP)
486    {
487      *((void**) addr) = om_AlwaysKeptAddrs;
488      om_AlwaysKeptAddrs = addr;
489      return;
490    }
491
492    if (om_NumberOfKeptAddrs)
493    {
494      omAssume(om_KeptAddr != NULL && om_LastKeptAddr != NULL &&
495               ((om_NumberOfKeptAddrs == 1 && om_LastKeptAddr == om_KeptAddr) ||
496                (om_NumberOfKeptAddrs != 1 && om_LastKeptAddr != om_KeptAddr)));
497      om_NumberOfKeptAddrs++;
498      *((void**) om_LastKeptAddr) = addr;
499      om_LastKeptAddr = addr;
500      *((void**) addr) = NULL;
501    }
502    else
503    {
504      om_NumberOfKeptAddrs = 1;
505      om_LastKeptAddr = addr;
506      om_KeptAddr = addr;
507      *((void**) om_LastKeptAddr) = NULL;
508    }
509
510    if (om_NumberOfKeptAddrs > om_Opts.Keep)
511    {
512      omError_t status = omDoCheckAddr(om_KeptAddr, NULL, OM_FKEPT, om_Opts.MinCheck,
513                                       omError_MemoryCorrupted, OM_FLR_VAL);
514      addr = om_KeptAddr;
515      if (addr!=NULL) om_KeptAddr = *((void**) addr);
516      om_NumberOfKeptAddrs--;
517      if (status != omError_NoError) return;
518    }
519    else
520      return;
521
522    bin = omGetOrigSpecBinOfAddr(addr);
523  }
524
525#ifdef OM_HAVE_TRACK
526  if (omIsTrackAddr(addr))
527  {
528    omMarkAsFreeTrackAddr(addr, 0, &flags, OM_FLR_VAL);
529    omFreeTrackAddr(addr);
530  }
531  else
532#endif
533    if (om_Opts.Keep <= 0 && ((flags & OM_FBIN) || (flags & OM_FBINADDR)))
534      __omFreeBinAddr(addr);
535    else if (om_Opts.Keep <= 0 && (flags & OM_FSIZE))
536      __omFreeSize(addr, (size_t) size_bin);
537    else
538      __omFree(addr);
539
540  if (bin != NULL) omUnGetSpecBin(&bin);
541}
542
543void omFreeKeptAddrFromBin(omBin bin)
544{
545  void* addr = om_KeptAddr;
546  void* prev_addr = NULL;
547  void* next_addr;
548  omTrackFlags_t flags;
549
550  while (addr != NULL)
551  {
552    next_addr = *((void**) addr);
553    if (omIsBinPageAddr(addr) && omGetTopBinOfAddr(addr) == bin)
554    {
555      if (prev_addr != NULL)
556        *((void**) prev_addr) = next_addr;
557      else
558        om_KeptAddr =  next_addr;
559      if (addr == om_LastKeptAddr)
560        om_LastKeptAddr = prev_addr;
561      om_NumberOfKeptAddrs--;
562#ifdef OM_HAVE_TRACK
563      if (omIsTrackAddr(addr))
564      {
565        omMarkAsFreeTrackAddr(addr, 0, &flags, OM_FLR);
566        omFreeTrackAddr(addr);
567      }
568    else
569#endif
570      __omFree(addr);
571      addr = next_addr;
572    }
573    else
574    {
575      prev_addr = addr;
576      addr = next_addr;
577    }
578  }
579
580  addr = om_AlwaysKeptAddrs;
581  prev_addr = NULL;
582  while (addr != NULL)
583  {
584    next_addr = *((void**) addr);
585    if (omIsBinPageAddr(addr) && omGetTopBinOfAddr(addr) == bin)
586    {
587      if (prev_addr != NULL)
588        *((void**) prev_addr) = next_addr;
589      else
590        om_AlwaysKeptAddrs = next_addr;
591#ifdef OM_HAVE_TRACK
592      if (omIsTrackAddr(addr))
593      {
594        omMarkAsFreeTrackAddr(addr, 0, &flags, OM_FLR);
595        omFreeTrackAddr(addr);
596      }
597    else
598#endif
599      __omFree(addr);
600      addr = next_addr;
601    }
602    else
603    {
604      prev_addr = addr;
605      addr = next_addr;
606    }
607  }
608}
609
610void omFreeKeptAddr()
611{
612  void* next;
613  omBin bin;
614  omTrackFlags_t flags;
615  void* addr = om_KeptAddr;
616
617  if (om_LastKeptAddr != NULL)
618    *((void**) om_LastKeptAddr) = om_AlwaysKeptAddrs;
619
620  om_NumberOfKeptAddrs = 0;
621  om_LastKeptAddr = NULL;
622  om_AlwaysKeptAddrs = NULL;
623  om_KeptAddr = NULL;
624
625  while (addr != NULL)
626  {
627    next = *((void**)addr);
628    bin = omGetOrigSpecBinOfAddr(addr);
629
630#ifdef OM_HAVE_TRACK
631    if (omIsTrackAddr(addr))
632    {
633      omMarkAsFreeTrackAddr(addr, 0, &flags, OM_FLR);
634      omFreeTrackAddr(addr);
635    }
636    else
637#endif
638      __omFree(addr);
639
640    addr = next;
641    if (bin != NULL) omUnGetSpecBin(&bin);
642  }
643}
644
645#endif /* ! OM_NDEBUG */
Note: See TracBrowser for help on using the repository browser.