source: git/omalloc/omtTest.c @ f3398d

spielwiese
Last change on this file since f3398d was f3398d, checked in by Olaf Bachmann <obachman@…>, 24 years ago
* syntax errors git-svn-id: file:///usr/local/Singular/svn/trunk@4605 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 9.4 KB
Line 
1#include "omtTest.h"
2
3#if CHECK_LEVEL > 0
4#define OM_CHECK CHECK_LEVEL
5#endif
6
7#include "omAlloc.h"
8
9omMemCell_t cells[MAX_CELLS];
10int errors = 0;
11int missed_errors = 0;
12int used_regions = 0;
13int seed;
14
15#if defined (__hpux) || defined (__alpha)  || defined (__svr4__) || defined (__SVR4)
16/* HPUX lacks random().  DEC OSF/1 1.2 random() returns a double.  */
17long mrand48 ();
18void srand48();
19static long
20random ()
21{
22  return mrand48 ();
23}
24static void srandom(long seed)
25{
26  srand48(seed);
27}
28#endif
29
30#if CHECK_LEVEL > 0
31void omtTestDebug(omMemCell cell)
32{
33  size_t size = GET_SIZE(cell->spec);
34  size_t is_size;
35 
36  if (om_ErrorStatus != omError_NoError) return;
37  if (cell->bin != NULL)
38  {
39    if (IS_ALIGNED(cell->spec))
40      omDebugAddrAlignedBin(cell->addr, cell->bin);
41    else
42      omDebugAddrBin(cell->addr, cell->bin);
43  }
44  else
45  {
46    if (IS_ALIGNED(cell->spec))
47      omDebugAddrAlignedSize(cell->addr, size);
48    else
49      omDebugAddrSize(cell->addr, size);
50  }
51  if (om_ErrorStatus != omError_NoError) return;
52 
53  if (!OM_IS_ALIGNED(cell->addr))
54  {
55    omReportError(omError_Unknown, omError_NoError, OM_FLR,
56                  "addr:%p is unaligned", cell->addr);
57    return;
58  }
59
60  if (IS_ALIGNED(cell->spec) && !OM_IS_STRICT_ALIGNED(cell->addr))
61  {
62    omReportError(omError_Unknown, omError_NoError, OM_FLR,
63                  "addr:%p is not strict unaligned", cell->addr);
64    return;
65  }
66 
67  is_size = omSizeOfAddr(cell->addr);
68  if (!OM_IS_ALIGNED(is_size))
69  {
70    omReportError(omError_Unknown, omError_NoError, OM_FLR,
71                  "is_size == %u is unaligned", is_size);
72    return;
73  }
74  if (is_size < size)
75  {
76    omReportError(omError_Unknown, omError_NoError, OM_FLR,
77                  "is_size==%u < size==%u", is_size, size);
78    return;
79  }
80
81  if (is_size >> LOG_SIZEOF_LONG != omSizeWOfAddr(cell->addr))
82  {
83    omReportError(omError_Unknown, omError_NoError, OM_FLR,
84                  "is_sizeW==%u < sizeW==%u", is_size >> LOG_SIZEOF_LONG, omSizeWOfAddr(cell->addr));
85    return;
86  }
87   
88  TestAddrContent(cell->addr, (IS_ZERO(cell->spec) ? 0 : cell->spec), is_size);
89}
90
91void TestAddrContentEqual(void* s1, void* s2, size_t size)
92{
93  int i;
94  size_t sizeW = OM_ALIGN_SIZE(size) >> LOG_SIZEOF_LONG;
95 
96  for (i=0; i<sizeW; i++)
97  {
98    if (((unsigned long*)s1)[i] != ((unsigned long*)s2)[i])
99    {
100       omReportError(omError_Unknown, omError_NoError, OM_FLR,
101                     "s1[%u]==%d  !=  s2[%u]==%d", i, ((unsigned long*)s1)[i], i, ((unsigned long*)s2)[i]);
102       return;
103    }
104  }
105}
106
107void TestAddrContent(void* addr, unsigned long value, size_t size)
108{
109  size_t sizeW = OM_ALIGN_SIZE(size) >> LOG_SIZEOF_LONG;
110  int i;
111 
112  if (!OM_IS_ALIGNED(addr))
113  {
114    omReportError(omError_Unknown, omError_NoError, OM_FLR, 
115                  "addr %p unaligned", addr);
116    return;
117  }
118 
119  for (i=0; i<sizeW; i++)
120  {
121    if (((unsigned long*)addr)[i] != value)
122    {
123      omReportError(omError_Unknown, omError_NoError, OM_FLR, 
124                    "word %d modified: is %u should be %u", i, ((unsigned long*)addr)[i], value);
125      return;
126    }
127  }
128}
129#endif
130
131void InitCellAddrContent(omMemCell cell)
132{
133  size_t sizeW = omSizeWOfAddr(cell->addr);
134  omMemsetW(cell->addr, (IS_ZERO(cell->spec) ? 0 : cell->spec), sizeW);
135}
136 
137void omCheckCells(int n, int level, omMemCell_t* cells)
138{
139#if END_CHECK_LEVEL > 0
140  int l = om_Opts.MinCheck;
141  int i;
142 
143  omTestMemory(level);
144  om_Opts.MinCheck = 1;
145  for (i=0; i<n; i++)
146  {
147    omtTestDebug(&cells[i]);
148    if (om_ErrorStatus != omError_NoError)
149    {
150      errors++;
151      om_ErrorStatus = omError_NoError;
152    }
153    if ((i % 10000) == 0) 
154    {
155      printf(".");
156      fflush(stdout);
157    }
158  }
159  om_Opts.MinCheck = l;
160#endif
161}
162
163
164int size_range = RANGE_MIN;
165int size_range_number = RANGE_MAX / RANGE_MIN;
166
167int MyRandSpec()
168{
169  unsigned long spec = random() + 1;
170  if (! size_range_number)
171  {
172    size_range = size_range << 1;
173    if (size_range > RANGE_MAX) size_range = RANGE_MIN;
174    size_range_number = RANGE_MAX / size_range;
175  }
176  SET_SIZE(spec, GET_SIZE(spec) & (size_range -1));
177  size_range_number--;
178  if (GET_SIZE(spec) == 0) spec++;
179  return spec;
180}
181
182
183void TestAlloc(omMemCell cell, unsigned long spec)
184{
185  if (DO_CHECK(spec))
186  {
187    if (DO_TRACK(spec))
188      om_Opts.MinTrack = GET_TRACK(spec);
189    else
190      om_Opts.MinTrack = 0;
191   
192    if (DO_KEEP(spec))
193      omtTestAllocKeep(cell, spec);
194    else
195      omtTestAllocDebug(cell, spec);
196  }
197  else
198    omtTestAlloc(cell, spec);
199  if (om_ErrorStatus != omError_NoError)
200  {
201    errors++;
202    om_ErrorStatus = omError_NoError;
203  }
204}
205
206void TestRealloc(omMemCell cell, unsigned long spec)
207{
208  if (DO_CHECK(spec))
209  {
210    if (DO_TRACK(spec))
211      om_Opts.MinTrack = GET_TRACK(spec);
212    else
213      om_Opts.MinTrack = 0;
214   
215    if (DO_KEEP(spec))
216      omtTestReallocKeep(cell, spec);
217    else
218      omtTestReallocDebug(cell, spec);
219  }
220  else
221    omtTestRealloc(cell, spec);
222  if (om_ErrorStatus != omError_NoError)
223  {
224    errors++;
225    om_ErrorStatus = omError_NoError;
226  }
227}
228
229void TestDup(omMemCell cell, unsigned long spec)
230{
231  if (DO_CHECK(spec))
232  {
233    if (DO_TRACK(spec))
234      om_Opts.MinTrack = GET_TRACK(spec);
235    else
236      om_Opts.MinTrack = 0;
237   
238    if (DO_KEEP(spec))
239      omtTestDupKeep(cell, spec);
240    else
241      omtTestDupDebug(cell, spec);
242  }
243  else
244    omtTestDup(cell, spec);
245
246  if (om_ErrorStatus != omError_NoError)
247  {
248    errors++;
249    om_ErrorStatus = omError_NoError;
250  }
251}
252
253void TestFree(omMemCell cell)
254{
255  if (cell->addr != NULL)
256  {
257    if (DO_FREE_CHECK(cell->spec))
258    {
259      if (DO_KEEP(cell->spec))
260        omtTestFreeKeep(cell);
261      else
262        omtTestFreeDebug(cell);
263    }
264    else
265    {
266      omtTestFree(cell);
267    }
268    if (om_ErrorStatus != omError_NoError)
269    {
270      errors++;
271      om_ErrorStatus = omError_NoError;
272    }
273  }
274}
275
276void my_exit()
277{
278  printf("\nomtTest Summary: ");
279  if (errors || missed_errors || used_regions)
280  {   
281    printf("***FAILED***errors:%d, missed_errors:%d, used_regions:%d, seed=%d\n", errors, missed_errors, used_regions, seed);
282    if (errors) exit(errors);
283    if (missed_errors) exit(missed_errors);
284    if (used_regions) exit(used_regions);
285  }
286  else
287  {
288    printf("OK\n");
289    exit(0);
290  }
291}
292
293
294int main(int argc, char* argv[])
295{
296  int i=0, error_test = 1;
297  unsigned long spec, j;
298  int n = 1;
299  int n_cells = MAX_CELLS;
300  int decr = 2;
301  int last_kept_freed = 0;
302  om_Opts.MinCheck = CHECK_LEVEL;
303  om_Opts.Keep = KEEP_ADDR;
304 
305  seed = time(NULL);
306 
307  omInitRet_2_Info(argv[0]);
308  omInitGetBackTrace();
309  omInitInfo();
310  om_Opts.PagesPerRegion = PAGES_PER_REGION;
311 
312  if (argc > 1) sscanf(argv[1], "%d", &error_test);
313  if (argc > 2) sscanf(argv[2], "%d", &seed);
314  srandom(seed);
315
316  if (argc > 3) sscanf(argv[3], "%d", &n);
317  if (argc > 4) sscanf(argv[4], "%d", &decr);
318 
319  if (decr < 2) decr = 2;
320  printf("seed == %d\n", seed);
321  fflush(stdout);
322  while (1)
323  {
324    if (i == n_cells)
325    {
326      i = 0;
327      printf("\nCells: %d KeptAddr:%d AlwaysKeptAddr:%d\n", n_cells,
328#ifndef OM_NDEBUG
329             omListLength(om_KeptAddr), omListLength(om_AlwaysKeptAddrs)
330#else
331             0, 0
332#endif
333             );
334
335      printf("Checking Memory and all cells ");
336      fflush(stdout);
337      omCheckCells(n_cells, END_CHECK_LEVEL, cells);
338      printf("\n");
339      omPrintStats(stdout);
340      omPrintInfo(stdout);
341      if (om_Info.CurrentRegionsAlloc > 0) omPrintBinStats(stdout);
342      fflush(stdout);
343#if CHECK_LEVEL > 0 && TRACK_LEVEL > 0
344      if (error_test && errors == 0)
345      {
346        missed_errors = omtTestErrors();
347        if (missed_errors < 0) 
348        {
349          my_exit();
350        }
351      }
352#endif
353      while (i< n_cells)
354      {
355        TestFree(&cells[i]);
356        i++;
357      }
358      omFreeKeptAddr();
359      omPrintStats(stdout);
360      omPrintInfo(stdout);
361      if (om_Info.CurrentRegionsAlloc > 0) 
362      {
363        omPrintBinStats(stdout);
364        used_regions += om_Info.CurrentRegionsAlloc;
365      }
366      omPrintUsedAddrs(stdout, 5);
367      i=0;
368      n--;
369      if (n <= 0 || n_cells <= 100)
370      {
371        my_exit();
372      }
373      else
374      {
375        n_cells = n_cells / decr;
376      }
377    }
378    spec = MyRandSpec();
379    myprintf("%d:%lu:%ld:%ld", i, spec, GET_SIZE(spec), GET_TRACK(spec));
380    myfflush(stdout);
381    if (DO_FREE(spec))
382    {
383      if (i != 0) 
384      {
385        myprintf(" FREE");
386        j = spec % i;
387        myprintf(" %ld ", j);
388        myfflush(stdout);
389        TestFree(&cells[j]);
390        TestAlloc(&cells[j], spec);
391      }
392    }
393    else if (DO_REALLOC(spec))
394    {
395      if (i != 0) 
396      {
397        myprintf(" REALLOC");
398        j = spec % i;
399        myprintf(" %ld ", j);
400        myfflush(stdout);
401        TestRealloc(&cells[j], spec);
402      }
403    }
404    else if (DO_DUP(spec))
405    {
406      if (i != 0)
407      {
408        myprintf(" DUP");
409        j = spec % i;
410        myprintf(" %ld ", j);
411        myfflush(stdout);
412        TestDup(&cells[j], spec);
413      }
414    }
415    else
416    {
417      myprintf(" ALLOC");
418      myfflush(stdout);
419      TestAlloc(&cells[i], spec);
420      i++;
421      if (i % 1000 == 0)
422      {
423        printf("%d:", i / 1000);
424        fflush(stdout);
425      }
426    }
427    myprintf("\n");
428    myfflush(stdout);
429    // free kept addresses from time to time
430    if ((i % 10000) == 0 && i != n_cells && i!=last_kept_freed)
431    {
432      printf("F:");
433      omFreeKeptAddr();
434      last_kept_freed = i;
435    }
436#if 0
437    if (CHECK_LEVEL > 2)
438    {
439      for (j=0; j<i; j++)
440      {
441        omtTestDebug(&cells[j]);
442      }
443    }
444#endif
445  }
446  return 0;
447}
448     
449       
Note: See TracBrowser for help on using the repository browser.