source: tests/heap.cfa @ 25cbd99

arm-ehjacob/cs343-translationnew-astnew-ast-unique-expr
Last change on this file since 25cbd99 was 25cbd99, checked in by Peter A. Buhr <pabuhr@…>, 16 months ago

change calloc/realloc to use malloc_size versus malloc_usable_size, fix bugs

  • Property mode set to 100644
File size: 15.5 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// heap.cfa --
8//
9// Author           : Peter A. Buhr
10// Created On       : Tue Nov  6 17:54:56 2018
11// Last Modified By : Peter A. Buhr
12// Last Modified On : Mon Aug  3 16:40:06 2020
13// Update Count     : 54
14//
15
16#include <thread.hfa>
17#include <kernel.hfa>                                                                   // processor
18#include <stdlib.hfa>                                                                   // *allocs
19#include <malloc.h>                                                                             // malloc_*
20
21// #include <time.hfa>
22// #define __CFA_DEFAULT_PREEMPTION__ 1000`us
23// //#define __CFA_DEFAULT_PREEMPTION__ 0
24
25// Duration default_preemption() {
26//      return __CFA_DEFAULT_PREEMPTION__;
27// }
28
29#define __U_DEFAULT_MMAP_START__ (512 * 1024 + 1)
30size_t default_mmap_start() __attribute__(( weak )) {
31        return __U_DEFAULT_MMAP_START__;
32} // default_mmap_start
33
34thread Worker {
35}; // Worker
36
37void main( Worker & ) {
38        enum { NoOfAllocs = 5000, NoOfMmaps = 10 };
39        char * locns[NoOfAllocs];
40        size_t amount;
41        enum { limit = 64 * 1024 };                                                     // check alignments up to here
42
43        // check alloc/free
44
45        for ( j; 40 ) {
46                for ( i; NoOfAllocs ) {
47                        locns[i] = alloc( i );
48                        //sout | (void *)locns[i];
49                        for ( k; i ) locns[i][k] = '\345';
50                } // for
51                //sout | (char *)sbrk(0) - start | " bytes";
52
53                for ( i; NoOfAllocs ) {
54                        //sout | (void *)locns[i];
55                        for ( k; i ) if ( locns[i][k] != '\345' ) abort( "new/delete corrupt storage1" );
56                        free( locns[i] );
57                } // for
58                //sout | (char *)sbrk(0) - start | " bytes";
59
60                for ( i; NoOfAllocs ) {
61                        locns[i] = alloc( i );
62                        //sout | (void *)locns[i];
63                        for ( k; i ) locns[i][k] = '\345';
64                } // for
65                for ( i; NoOfAllocs - 1 -~= 0 ) {
66                        //sout | (void *)locns[i];
67                        for ( k; i ) if ( locns[i][k] != '\345' ) abort( "new/delete corrupt storage2" );
68                        free( locns[i] );
69                } // for
70        } // for
71
72        // check malloc/free (sbrk)
73
74        for ( i; NoOfAllocs ) {
75                size_t s = (i + 1) * 20;
76                char * area = (char *)malloc( s );
77                area[0] = '\345'; area[s - 1] = '\345';                 // fill first/last
78                area[malloc_usable_size( area ) - 1] = '\345';  // fill ultimate byte
79                free( area );
80        } // for
81
82        for ( i; NoOfAllocs ) {
83                size_t s = i + 1;                                                               // +1 to make initialization simpler
84                locns[i] = (char *)malloc( s );
85                locns[i][0] = '\345'; locns[i][s - 1] = '\345'; // fill first/last
86                locns[i][malloc_usable_size( locns[i] ) - 1] = '\345'; // fill ultimate byte
87        } // for
88        for ( i; NoOfAllocs ) {
89                size_t s = i + 1;
90                if ( locns[i][0] != '\345' || locns[i][s - 1] != '\345' ||
91                         locns[i][malloc_usable_size( locns[i] ) - 1] != '\345' ) abort( "malloc/free corrupt storage" );
92                free( locns[i] );
93        } // for
94
95        // check malloc/free (mmap)
96
97        for ( i; NoOfMmaps ) {
98                size_t s = i + default_mmap_start();                    // cross over point
99                char * area = (char *)malloc( s );
100                area[0] = '\345'; area[s - 1] = '\345';                 // fill first/last
101                area[malloc_usable_size( area ) - 1] = '\345';  // fill ultimate byte
102                free( area );
103        } // for
104
105        for ( i; NoOfMmaps ) {
106                size_t s = i + default_mmap_start();                    // cross over point
107                locns[i] = (char *)malloc( s );
108                locns[i][0] = '\345'; locns[i][s - 1] = '\345'; // fill first/last
109                locns[i][malloc_usable_size( locns[i] ) - 1] = '\345'; // fill ultimate byte
110        } // for
111        for ( i; NoOfMmaps ) {
112                size_t s = i + default_mmap_start();                    // cross over point
113                if ( locns[i][0] != '\345' || locns[i][s - 1] != '\345' ||
114                         locns[i][malloc_usable_size( locns[i] ) - 1] != '\345' ) abort( "malloc/free corrupt storage" );
115                free( locns[i] );
116        } // for
117
118        // check calloc/free (sbrk)
119
120        for ( i; NoOfAllocs ) {
121                size_t s = (i + 1) * 20;
122                char * area = (char *)calloc( 5, s );
123                if ( area[0] != '\0' || area[s - 1] != '\0' ||
124                         area[malloc_size( area ) - 1] != '\0' ||
125                         ! malloc_zero_fill( area ) ) abort( "calloc/free corrupt storage1" );
126                area[0] = '\345'; area[s - 1] = '\345';                 // fill first/last
127                area[malloc_usable_size( area ) - 1] = '\345';  // fill ultimate byte
128                free( area );
129        } // for
130
131        for ( i; NoOfAllocs ) {
132                size_t s = i + 1;
133                locns[i] = (char *)calloc( 5, s );
134                if ( locns[i][0] != '\0' || locns[i][s - 1] != '\0' ||
135                         locns[i][malloc_size( locns[i] ) - 1] != '\0' ||
136                         ! malloc_zero_fill( locns[i] ) ) abort( "calloc/free corrupt storage2" );
137                locns[i][0] = '\345'; locns[i][s - 1] = '\345'; // fill first/last
138                locns[i][malloc_usable_size( locns[i] ) - 1] = '\345'; // fill ultimate byte
139        } // for
140        for ( i; NoOfAllocs ) {
141                size_t s = i + 1;
142                if ( locns[i][0] != '\345' || locns[i][s - 1] != '\345' ||
143                         locns[i][malloc_usable_size( locns[i] ) - 1] != '\345' ) abort( "calloc/free corrupt storage3" );
144                free( locns[i] );
145        } // for
146
147        // check calloc/free (mmap)
148
149        for ( i; NoOfMmaps ) {
150                size_t s = i + default_mmap_start();                    // cross over point
151                char * area = (char *)calloc( 1, s );
152                if ( area[0] != '\0' || area[s - 1] != '\0' ) abort( "calloc/free corrupt storage4.1" );
153                if ( area[malloc_size( area ) - 1] != '\0' ) abort( "calloc/free corrupt storage4.2" );
154                if ( ! malloc_zero_fill( area ) ) abort( "calloc/free corrupt storage4.3" );
155                area[0] = '\345'; area[s - 1] = '\345';                 // fill first/last
156                area[malloc_usable_size( area ) - 1] = '\345';  // fill ultimate byte
157                free( area );
158        } // for
159
160        for ( i; NoOfMmaps ) {
161                size_t s = i + default_mmap_start();                    // cross over point
162                locns[i] = (char *)calloc( 1, s );
163                if ( locns[i][0] != '\0' || locns[i][s - 1] != '\0' ||
164                         locns[i][malloc_size( locns[i] ) - 1] != '\0' ||
165                         ! malloc_zero_fill( locns[i] ) ) abort( "calloc/free corrupt storage5" );
166                locns[i][0] = '\345'; locns[i][s - 1] = '\345'; // fill first/last
167                locns[i][malloc_usable_size( locns[i] ) - 1] = '\345'; // fill ultimate byte
168        } // for
169        for ( i; NoOfMmaps ) {
170                size_t s = i + default_mmap_start();                    // cross over point
171                if ( locns[i][0] != '\345' || locns[i][s - 1] != '\345' ||
172                         locns[i][malloc_usable_size( locns[i] ) - 1] != '\345' ) abort( "calloc/free corrupt storage6" );
173                free( locns[i] );
174        } // for
175
176        // check memalign/free (sbrk)
177
178        for ( a; libAlign() ~= limit ~ a ) {                            // generate powers of 2
179                //sout | alignments[a];
180                for ( s; 1 ~ NoOfAllocs ) {                                             // allocation of size 0 can return null
181                        char * area = (char *)memalign( a, s );
182                        //sout | i | area;
183                        if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
184                                abort( "memalign/free bad alignment : memalign(%d,%d) = %p", (int)a, s, area );
185                        } // if
186                        area[0] = '\345'; area[s - 1] = '\345';         // fill first/last byte
187                        area[malloc_usable_size( area ) - 1] = '\345'; // fill ultimate byte
188                        free( area );
189                } // for
190        } // for
191
192        // check memalign/free (mmap)
193
194        for ( a; libAlign() ~= limit ~ a ) {                            // generate powers of 2
195                //sout | alignments[a];
196                for ( i; 1 ~ NoOfMmaps ) {
197                        size_t s = i + default_mmap_start();            // cross over point
198                        char * area = (char *)memalign( a, s );
199                        //sout | i | area;
200                        if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
201                                abort( "memalign/free bad alignment : memalign(%d,%d) = %p", (int)a, (int)s, area );
202                        } // if
203                        area[0] = '\345'; area[s - 1] = '\345';         // fill first/last byte
204                        area[malloc_usable_size( area ) - 1] = '\345'; // fill ultimate byte
205                        free( area );
206                } // for
207        } // for
208
209        // check calloc/realloc/free (sbrk)
210
211        for ( i; 1 ~ 10_000 ~ 12 ) {
212                // initial N byte allocation
213                char * area = (char *)calloc( 5, i );
214                if ( area[0] != '\0' || area[i - 1] != '\0' ||
215                         area[malloc_size( area ) - 1] != '\0' ||
216                         ! malloc_zero_fill( area ) ) abort( "calloc/realloc/free corrupt storage1" );
217
218                // Do not start this loop index at 0 because realloc of 0 bytes frees the storage.
219                for ( s; i ~ 256 * 1024 ~ 26 ) {                                // start at initial memory request
220                        area = (char *)realloc( area, s );                      // attempt to reuse storage
221                        if ( area[0] != '\0' || area[s - 1] != '\0' ||
222                                 area[malloc_size( area ) - 1] != '\0' ||
223                                 ! malloc_zero_fill( area ) ) abort( "calloc/realloc/free corrupt storage2" );
224                } // for
225                free( area );
226        } // for
227
228        // check calloc/realloc/free (mmap)
229
230        for ( i; 1 ~ 10_000 ~ 12 ) {
231                // initial N byte allocation
232                size_t s = i + default_mmap_start();                    // cross over point
233                char * area = (char *)calloc( 1, s );
234//              if ( area == 0p ) abort( "calloc/realloc/free out of memory" );
235                if ( area[0] != '\0' || area[s - 1] != '\0' ||
236                         area[malloc_size( area ) - 1] != '\0' ||
237                         ! malloc_zero_fill( area ) ) //abort( "calloc/realloc/free corrupt storage3" );
238                        printf( "C %zd %d %d %d %d\n", s, area[0] != '\0', area[s - 1] != '\0', area[malloc_size( area ) - 1] != '\0', ! malloc_zero_fill( area ) );
239
240                // Do not start this loop index at 0 because realloc of 0 bytes frees the storage.
241                for ( r; i ~ 256 * 1024 ~ 26 ) {                                // start at initial memory request
242                        area = (char *)realloc( area, r );                      // attempt to reuse storage
243//                      if ( area == 0p ) abort( "calloc/realloc/free out of memory" );
244                        if ( area[0] != '\0' || area[r - 1] != '\0' ||
245                                 area[malloc_size( area ) - 1] != '\0' ||
246                                 ! malloc_zero_fill( area ) ) abort( "calloc/realloc/free corrupt storage4" );
247                } // for
248                free( area );
249        } // for
250
251        // check memalign/realloc/free
252
253        amount = 2;
254        for ( a; libAlign() ~= limit ~ a ) {                            // generate powers of 2
255                // initial N byte allocation
256                char * area = (char *)memalign( a, amount );    // aligned N-byte allocation
257//              if ( area == 0p ) abort( "memalign/realloc/free out of memory" ); // no storage ?
258                //sout | alignments[a] | area;
259                if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
260                        abort( "memalign/realloc/free bad alignment : memalign(%d,%d) = %p", (int)a, (int)amount, area );
261                } // if
262                area[0] = '\345'; area[amount - 2] = '\345';    // fill first/penultimate byte
263
264                // Do not start this loop index at 0 because realloc of 0 bytes frees the storage.
265                for ( s; amount ~ 256 * 1024 ) {                                // start at initial memory request
266                        if ( area[0] != '\345' || area[s - 2] != '\345' ) abort( "memalign/realloc/free corrupt storage" );
267                        area = (char *)realloc( area, s );                      // attempt to reuse storage
268                        //sout | i | area;
269                        if ( (size_t)area % a != 0 ) {                          // check for initial alignment
270                                abort( "memalign/realloc/free bad alignment %p", area );
271                        } // if
272                        area[s - 1] = '\345';                                           // fill last byte
273                } // for
274                free( area );
275        } // for
276
277        // check cmemalign/free
278
279        for ( a; libAlign() ~= limit ~ a ) {                            // generate powers of 2
280                //sout | alignments[a];
281                for ( s; 1 ~ limit ) {                                                  // allocation of size 0 can return null
282                        char * area = (char *)cmemalign( a, 1, s );
283                        //sout | i | area;
284                        if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
285                                abort( "cmemalign/free bad alignment : cmemalign(%d,%d) = %p", (int)a, s, area );
286                        } // if
287                        if ( area[0] != '\0' || area[s - 1] != '\0' ||
288                                 area[malloc_size( area ) - 1] != '\0' ||
289                                 ! malloc_zero_fill( area ) ) abort( "cmemalign/free corrupt storage" );
290                        area[0] = '\345'; area[s - 1] = '\345';         // fill first/last byte
291                        free( area );
292                } // for
293        } // for
294
295        // check cmemalign/realloc/free
296
297        amount = 2;
298        for ( a; libAlign() ~= limit ~ a ) {                            // generate powers of 2
299                // initial N byte allocation
300                char * area = (char *)cmemalign( a, 1, amount ); // aligned N-byte allocation
301                //sout | alignments[a] | area;
302                if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
303                        abort( "cmemalign/realloc/free bad alignment : cmemalign(%d,%d) = %p", (int)a, (int)amount, area );
304                } // if
305                if ( area[0] != '\0' || area[amount - 1] != '\0' ||
306                         area[malloc_size( area ) - 1] != '\0' ||
307                         ! malloc_zero_fill( area ) ) abort( "cmemalign/realloc/free corrupt storage1" );
308                area[0] = '\345'; area[amount - 2] = '\345';    // fill first/penultimate byte
309
310                // Do not start this loop index at 0 because realloc of 0 bytes frees the storage.
311                for ( s; amount ~ 256 * 1024 ) {                                // start at initial memory request
312                        if ( area[0] != '\345' || area[s - 2] != '\345' ) abort( "cmemalign/realloc/free corrupt storage2" );
313                        area = (char *)realloc( area, s );                      // attempt to reuse storage
314                        //sout | i | area;
315                        if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
316                                abort( "cmemalign/realloc/free bad alignment %p", area );
317                        } // if
318                        if ( area[0] != '\345' || area[s - 1] != '\0' ||
319                                 area[malloc_size( area ) - 1] != '\0' ||
320                                 ! malloc_zero_fill( area ) ) abort( "cmemalign/realloc/free corrupt storage3" );
321                        area[s - 1] = '\345';                                           // fill last byte
322                } // for
323                free( area );
324        } // for
325
326        // check memalign/realloc with align/free
327
328        amount = 2;
329        for ( a; libAlign() ~= limit ~ a ) {                            // generate powers of 2
330                // initial N byte allocation
331                char * area = (char *)memalign( a, amount );    // aligned N-byte allocation
332                //sout | alignments[a] | area | endl;
333                if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
334                        abort( "memalign/realloc with align/free bad alignment : memalign(%d,%d) = %p", (int)a, (int)amount, area );
335                } // if
336                area[0] = '\345'; area[amount - 2] = '\345';    // fill first/penultimate byte
337
338                // Do not start this loop index at 0 because realloc of 0 bytes frees the storage.
339                for ( s; amount ~ 256 * 1024 ) {                                // start at initial memory request
340                        if ( area[0] != '\345' || area[s - 2] != '\345' ) abort( "memalign/realloc/free corrupt storage" );
341                        area = (char *)realloc( area, a * 2, s );       // attempt to reuse storage
342                        //sout | i | area | endl;
343                        if ( (size_t)area % a * 2 != 0 ) {                      // check for initial alignment
344                                abort( "memalign/realloc with align/free bad alignment %p", area );
345                        } // if
346                        area[s - 1] = '\345';                                           // fill last byte
347                } // for
348                free( area );
349        } // for
350
351        // check cmemalign/realloc with align/free
352
353        amount = 2;
354        for ( size_t a = libAlign() + libAlign(); a <= limit; a += a ) { // generate powers of 2
355                // initial N byte allocation
356                char *area = (char *)cmemalign( a, 1, amount ); // aligned N-byte allocation
357                //sout | alignments[a] | area | endl;
358                if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
359                        abort( "cmemalign/realloc with align/free bad alignment : cmemalign(%d,%d) = %p", (int)a, (int)amount, area );
360                } // if
361                if ( area[0] != '\0' || area[amount - 1] != '\0' ||
362                         area[malloc_size( area ) - 1] != '\0' ||
363                         ! malloc_zero_fill( area ) ) abort( "cmemalign/realloc with align/free corrupt storage1" );
364                area[0] = '\345'; area[amount - 2] = '\345';    // fill first/penultimate byte
365
366                // Do not start this loop index at 0 because realloc of 0 bytes frees the storage.
367                for ( int s = amount; s < 256 * 1024; s += 1 ) { // start at initial memory request
368                        if ( area[0] != '\345' || area[s - 2] != '\345' ) abort( "cmemalign/realloc with align/free corrupt storage2" );
369                        area = (char *)realloc( area, a * 2, s );       // attempt to reuse storage
370                        //sout | i | area | endl;
371                        if ( (size_t)area % a * 2 != 0 || malloc_alignment( area ) != a * 2 ) { // check for initial alignment
372                                abort( "cmemalign/realloc with align/free bad alignment %p %jd %jd", area, malloc_alignment( area ), a * 2 );
373                        } // if
374                        if ( area[s - 1] != '\0' || area[s - 1] != '\0' ||
375                                 area[malloc_size( area ) - 1] != '\0' ||
376                                 ! malloc_zero_fill( area ) ) abort( "cmemalign/realloc/free corrupt storage3" );
377                        area[s - 1] = '\345';                                           // fill last byte
378                } // for
379                free( area );
380        } // for
381
382        //sout | "worker" | thisTask() | "successful completion";
383} // Worker main
384
385int main() {
386        const unsigned int NoOfWorkers = 4;
387        {
388                processor processors[NoOfWorkers - 1] __attribute__(( unused )); // more than one processor
389                Worker workers[NoOfWorkers] __attribute__(( unused ));
390        }
391        // checkFreeOn();
392        // malloc_stats();
393}
394
395// Local Variables: //
396// tab-width: 4 //
397// compile-command: "cfa -nodebug -O2 heap.cfa" //
398// End: //
Note: See TracBrowser for help on using the repository browser.