source: git/omalloc/omtTest.c @ 78f1ab

spielwiese
Last change on this file since 78f1ab was 78f1ab, checked in by Olaf Bachmann <obachman@…>, 24 years ago
HP porting git-svn-id: file:///usr/local/Singular/svn/trunk@4542 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 8.7 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  }
154  om_Opts.MinCheck = l;
155#endif
156}
157
158
159int size_range = RANGE_MIN;
160int size_range_number = RANGE_MAX / RANGE_MIN;
161
162int MyRandSpec()
163{
164#if 0
165  /* This behaves badly on the HP's, because RAND_MAX == 32767 */
166  int spec = 1 + (int) ( ((double) SPEC_MAX)* ((double) random())/(RAND_MAX + 1.0));
167#else
168  unsigned long spec = random() + 1;
169#endif 
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    omtTestAllocDebug(cell, spec);
193  }
194  else
195    omtTestAlloc(cell, spec);
196  if (om_ErrorStatus != omError_NoError)
197  {
198    errors++;
199    om_ErrorStatus = omError_NoError;
200  }
201}
202
203void TestRealloc(omMemCell cell, unsigned long spec)
204{
205  if (DO_CHECK(spec))
206  {
207    if (DO_TRACK(spec))
208      om_Opts.MinTrack = GET_TRACK(spec);
209    else
210      om_Opts.MinTrack = 0;
211   
212    omtTestReallocDebug(cell, spec);
213  }
214  else
215    omtTestRealloc(cell, spec);
216  if (om_ErrorStatus != omError_NoError)
217  {
218    errors++;
219    om_ErrorStatus = omError_NoError;
220  }
221}
222
223void TestDup(omMemCell cell, unsigned long spec)
224{
225  if (DO_CHECK(spec))
226  {
227    if (DO_TRACK(spec))
228      om_Opts.MinTrack = GET_TRACK(spec);
229    else
230      om_Opts.MinTrack = 0;
231   
232    omtTestDupDebug(cell, spec);
233  }
234  else
235    omtTestDup(cell, spec);
236
237  if (om_ErrorStatus != omError_NoError)
238  {
239    errors++;
240    om_ErrorStatus = omError_NoError;
241  }
242}
243
244void TestFree(omMemCell cell)
245{
246  if (cell->addr != NULL)
247  {
248    if (DO_FREE_CHECK(cell->spec))
249    {
250      omtTestFreeDebug(cell);
251    }
252    else
253    {
254      omtTestFree(cell);
255    }
256    if (om_ErrorStatus != omError_NoError)
257    {
258      errors++;
259      om_ErrorStatus = omError_NoError;
260    }
261  }
262}
263
264void my_exit()
265{
266  printf("\notTest Summary: ");
267  if (errors || missed_errors || used_regions)
268  {   
269    printf("***FAILED***errors:%d, missed_errors:%d, used_regions:%d, seed=%d\n", errors, missed_errors, used_regions, seed);
270    if (errors) exit(errors);
271    if (missed_errors) exit(missed_errors);
272    if (used_regions) exit(used_regions);
273  }
274  else
275  {
276    printf("OK\n");
277    exit(0);
278  }
279}
280
281
282int main(int argc, char* argv[])
283{
284  int i=0, error_test = 1;
285  unsigned long spec, j;
286  int n = 1;
287  int n_cells = MAX_CELLS;
288  int decr = 2;
289  om_Opts.MinCheck = CHECK_LEVEL;
290  om_Opts.Keep = KEEP_ADDR;
291  seed = time(NULL);
292 
293  omInitRet_2_Info(argv[0]);
294  omInitGetBackTrace();
295  omInitInfo();
296  om_Opts.PagesPerRegion = PAGES_PER_REGION;
297 
298  if (argc > 1) sscanf(argv[1], "%d", &error_test);
299  if (argc > 2) sscanf(argv[2], "%d", &seed);
300  srandom(seed);
301
302  if (argc > 3) sscanf(argv[3], "%d", &n);
303  if (argc > 4) sscanf(argv[4], "%d", &decr);
304 
305  if (decr < 2) decr = 2;
306  printf("seed == %d\n", seed);
307  fflush(stdout);
308  while (1)
309  {
310    if (i == n_cells)
311    {
312      i = 0;
313      printf("\nCells: %d\n", n_cells);
314      fflush(stdout);
315      omCheckCells(n_cells, END_CHECK_LEVEL, cells);
316      omPrintStats(stdout);
317      omPrintInfo(stdout);
318      if (om_Info.CurrentRegionsAlloc > 0) omPrintBinStats(stdout);
319      fflush(stdout);
320#if CHECK_LEVEL > 0 && TRACK_LEVEL > 0
321      if (error_test && errors == 0)
322      {
323        missed_errors = omtTestErrors();
324        if (missed_errors < 0) 
325        {
326          my_exit();
327        }
328      }
329#endif
330      while (i< n_cells)
331      {
332        TestFree(&cells[i]);
333        i++;
334      }
335      omFreeKeptAddr();
336      omPrintStats(stdout);
337      omPrintInfo(stdout);
338      if (om_Info.CurrentRegionsAlloc > 0) 
339      {
340        omPrintBinStats(stdout);
341        used_regions += om_Info.CurrentRegionsAlloc;
342      }
343      omPrintUsedAddrs(stdout);
344      i=0;
345      n--;
346      if (n <= 0 || n_cells <= 100)
347      {
348        my_exit();
349      }
350      else
351      {
352        n_cells = n_cells / decr;
353      }
354    }
355    spec = MyRandSpec();
356    myprintf("%d:%lu:%ld:%ld", i, spec, GET_SIZE(spec), GET_TRACK(spec));
357    myfflush(stdout);
358    if (DO_FREE(spec))
359    {
360      if (i != 0) 
361      {
362        myprintf(" FREE");
363        j = spec % i;
364        myprintf(" %ld ", j);
365        myfflush(stdout);
366        TestFree(&cells[j]);
367        TestAlloc(&cells[j], spec);
368      }
369    }
370    else if (DO_REALLOC(spec))
371    {
372      if (i != 0) 
373      {
374        myprintf(" REALLOC");
375        j = spec % i;
376        myprintf(" %ld ", j);
377        myfflush(stdout);
378        TestRealloc(&cells[j], spec);
379      }
380    }
381    else if (DO_DUP(spec))
382    {
383      if (i != 0)
384      {
385        myprintf(" DUP");
386        j = spec % i;
387        myprintf(" %ld ", j);
388        myfflush(stdout);
389        TestDup(&cells[j], spec);
390      }
391    }
392    else
393    {
394      myprintf(" ALLOC");
395      myfflush(stdout);
396      TestAlloc(&cells[i], spec);
397      i++;
398      if (i % 1000 == 0)
399      {
400        printf("%d:", i / 1000);
401        fflush(stdout);
402      }
403    }
404    myprintf("\n");
405    myfflush(stdout);
406#if 0
407    if (CHECK_LEVEL > 2)
408    {
409      for (j=0; j<i; j++)
410      {
411        omtTestDebug(&cells[j]);
412      }
413    }
414#endif
415  }
416  return 0;
417}
418     
419       
Note: See TracBrowser for help on using the repository browser.