source: tests/heap.cfa@ 7768b8d

ADT arm-eh ast-experimental enum forall-pointer-decay jacob/cs343-translation new-ast new-ast-unique-expr pthread-emulation qualifiedEnum
Last change on this file since 7768b8d was 3e91703d, checked in by Peter A. Buhr <pabuhr@…>, 6 years ago

formatting

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