diff options
Diffstat (limited to 'lib/libmalloc/tests')
-rwxr-xr-x | lib/libmalloc/tests/munge.sh | 40 | ||||
-rwxr-xr-x | lib/libmalloc/tests/plot.sh | 81 | ||||
-rwxr-xr-x | lib/libmalloc/tests/regress | 11 | ||||
-rw-r--r-- | lib/libmalloc/tests/simumalloc.c | 239 | ||||
-rw-r--r-- | lib/libmalloc/tests/t1.c | 40 | ||||
-rw-r--r-- | lib/libmalloc/tests/t2.c | 37 | ||||
-rw-r--r-- | lib/libmalloc/tests/t3.c | 110 | ||||
-rw-r--r-- | lib/libmalloc/tests/t4.c | 20 | ||||
-rw-r--r-- | lib/libmalloc/tests/t5.c | 31 | ||||
-rw-r--r-- | lib/libmalloc/tests/test.out | 415 | ||||
-rw-r--r-- | lib/libmalloc/tests/testmalloc.c | 182 | ||||
-rw-r--r-- | lib/libmalloc/tests/testmemalign.c | 16 | ||||
-rwxr-xr-x | lib/libmalloc/tests/testrun.sh | 28 | ||||
-rw-r--r-- | lib/libmalloc/tests/testsbrk.c | 22 | ||||
-rw-r--r-- | lib/libmalloc/tests/teststomp.c | 34 |
15 files changed, 1306 insertions, 0 deletions
diff --git a/lib/libmalloc/tests/munge.sh b/lib/libmalloc/tests/munge.sh new file mode 100755 index 000000000000..d9a23309c11c --- /dev/null +++ b/lib/libmalloc/tests/munge.sh @@ -0,0 +1,40 @@ +#! /bin/sh +# takes output of testrun and massages into columnar form for easier +# evaluation and graphing +cat $* | tr ',' ' ' | + awk 'BEGIN { + printf " Maxtime Maxsize Maxlife Sbrked Alloced Wastage"; + printf " Real User Sys\n"; + } + $1 == "Maxtime" { + if (t != 0) { + printf "%8d%8d%8d%8d%8d %7.2f", t, s, l, sb, ma, w; + printf " %7.1f %7.1f %7.1f\n", mr, mu, ms; + } + t = $3; + s = $6; + l = $9; + mr = 100000; + mu = 100000; + ms = 100000; + next; + } + $1 == "Sbrked" { + sb = $2; + ma = $4; + w = $6; + next; + } + $2 == "real" { + if ($1 < mr) mr = $1; + if ($3 < mu) mu = $3; + if ($5 < ms) ms = $5; + next; + } + END { + if (t != 0) { + printf "%8d%8d%8d%8d%8d %7.2f", t, s, l, sb, ma, w; + printf " %7.1f %7.1f %7.1f\n", mr, mu, ms; + } + } + ' diff --git a/lib/libmalloc/tests/plot.sh b/lib/libmalloc/tests/plot.sh new file mode 100755 index 000000000000..74a8c8edd52e --- /dev/null +++ b/lib/libmalloc/tests/plot.sh @@ -0,0 +1,81 @@ +#! /bin/sh +# Things like +# '-s 10 file...' should plot Maxlife vs Wastage, Real, user + sys for all +# file for Maxsize == 10. +# '-l 10 file...' should plot Maxsize vs ... for Maxlife == 10. +usage="Usage: $0 [-s size | -l life] file..." +case $# in +[012]) + echo $usage >&2 + exit 1 + ;; +esac +tmp=./tmp.$$ +case $1 in +-s) + const='Maxsize' + indep='Maxlife' + units='iterations' + ;; +-l) + const='Maxlife' + indep='Maxsize' + units='words' + ;; +*) + echo $usage >&2 + exit 1 + ;; +esac +constval=$2 +shift +shift +mkdir $tmp +for i +do + base=`basename $i` + echo $base + ext=`expr "$base" : "res\.\(.*\)"` + awk '$1 == "Maxtime" { + for(i = 1; i <= NF; i++) { + field[$i] = i; + } + f1="'$tmp/W.$base'"; + f2="'$tmp/R.$base'"; + f3="'$tmp/US.$base'"; + print "\"" "'$ext'" > f1 + print "\"" "'$ext'" > f2 + print "\"" "'$ext'" > f3 + cfld=field["'$const'"]; + cval='$constval'; + xfld=field["'$indep'"]; + y1=field["Wastage"]; + y2=field["Real"]; + y3=field["User"]; + y4=field["Sys"]; + } + $cfld == cval { + print $xfld, $y1 * 100 >> f1; + print $xfld, $y2 >> f2; + print $xfld, $y3 + $y4 >> f3; + } + END { + print "" >> f1; + print "" >> f2; + print "" >> f3; + }' $i +done +cat $tmp/W.* > $tmp/W +rm -f $tmp/W.* +cat $tmp/R.* > $tmp/R +rm -f $tmp/R.* +cat $tmp/US.* > $tmp/US +rm -f $tmp/US.* +cd $tmp +xgraph -tk -bb -t "$const = $constval" -x "$indep ($units)" \ + -y 'User + System time (seconds)' US & +xgraph -tk -bb -t "$const = $constval" -x "$indep ($units)" \ + -y 'Elapsed time (seconds)' R & +xgraph -tk -bb -t "$const = $constval" -x "$indep ($units)" \ + -y 'Wastage (percent of data segment)' W & + diff --git a/lib/libmalloc/tests/regress b/lib/libmalloc/tests/regress new file mode 100755 index 000000000000..322aa608c196 --- /dev/null +++ b/lib/libmalloc/tests/regress @@ -0,0 +1,11 @@ +#! /bin/sh -x +# testmalloc tests some unusual cases -- will test all branches in free, +# which is important. +./testmalloc $@ +# simumalloc makes a good thorough exercise for malloc and free. +# need something for realloc, though. +./simumalloc -t 15000 -s 1024 -l 2000 $@ +./simumalloc -t 5000 -s 512 -l 20 $@ +./simumalloc -d -t 500 -s 512 -l 20 $@ +./simumalloc -d -t 500 -s 512 -l 500 $@ +./simumalloc -d -t 500 -s 512 -a $@ diff --git a/lib/libmalloc/tests/simumalloc.c b/lib/libmalloc/tests/simumalloc.c new file mode 100644 index 000000000000..f4607db3e453 --- /dev/null +++ b/lib/libmalloc/tests/simumalloc.c @@ -0,0 +1,239 @@ +/* + * To measure the speed of malloc - based on the algorithm described in + * "In Search of a Better Malloc" by David G. Korn and Kiem-Phong Vo, + * Usenix 1985. This is a vicious test of memory allocation, but does + * suffer from the problem that it asks for a uniform distribution of + * sizes - a more accurate distribution is a multi-normal distribution + * for all applications I've seen. + */ +/* Mark Moraes, CSRI, University of Toronto */ +#ifndef lint +static char rcsid[] = "$Id: simumalloc.c,v 1.1 1994/03/06 23:01:46 nate Exp $"; +#endif /*lint*/ + +#include <stdio.h> +#include <string.h> + +/* + * ANSI systems had better have this. Non-ANSI systems had better not + * complain about things that are implicitly declared int or void. + */ +#if defined(STDHEADERS) +# include <stdlib.h> +# include <unistd.h> +#endif + +#include "malloc.h" + +char *progname; +/* For getopt() */ +extern int getopt(); +extern int optind; +extern char *optarg; + + +int MaxTime, MaxLife, MaxSize, NumAllocs; + +typedef union u { + union u *ptr; + int size; +} word; + +#define MAXTIME 100000 +static word *bufs[MAXTIME]; + +unsigned long alloced = 0; +static unsigned long maxalloced = 0; + +#ifdef HAVE_RANDOM +extern long random(); +#define rnd(x) (random() % (long) (x)) +#define seedrnd(x) (srandom(x)) +#else /* ! HAVE_RANDOM */ +extern int rand(); +#define rnd(x) (rand() % (x)) +#define seedrnd(x) (srand(x)) +#endif /* HAVE_RANDOM */ + +#ifdef MYMALLOC +extern char * (* _malloc_memfunc)(); +#endif + +/* + * generally sprintf() to errstring and then call complain rather than + * use a varargs routine + */ +char errstring[128]; + +/* + * Should probably have a more fancy version that does perror as well + * in a library someplace - like error() + */ +void +complain(s) +char *s; +{ + (void) fprintf(stderr, "%s: %s\n", progname, s); + exit(-1); +} + +void +usage() +{ + (void) fprintf(stderr, "\ +Usage: %s [-t MaxTime] [-s MaxSize] [-l MaxLife] [-m Mmapfile] [-a] [-d]\n", progname); + exit(-1); +} + +int +main(argc, argv) +int argc; +char **argv; +{ + int c; + register int t; + char *before, *after; + extern char *sbrk(); + extern int atoi(); + extern void freeall(), reserve(); + unsigned long grew; + int alloconly = 0, use_mmap = 0, verbose = 0; + + progname = argv[0] ? argv[0] : "(no-argv[0])"; + NumAllocs = 1; + MaxTime = 15000; + MaxSize = 500; + MaxLife = 1000; + while((c = getopt(argc, argv, "n:t:s:l:dm:av")) != EOF) { + /* optarg has the current argument if the option was followed by ':'*/ + switch (c) { + case 't': + MaxTime = atoi(optarg); + if (MaxTime < 0 || MaxTime > MAXTIME) { + (void) fprintf(stderr, + "%s: MaxTime must be > 0 and < %d\n", progname, MAXTIME); + exit(-1); + } + break; + case 's': + MaxSize = atoi(optarg); + if (MaxSize < 1) + complain("MaxSize must be > 0"); + break; + case 'l': + MaxLife = atoi(optarg); + if (MaxLife < 0) + complain("MaxLife must be > 0"); + break; + case 'n': + NumAllocs = atoi(optarg); + if (NumAllocs <= 0) + complain("NumAllocs must be > 0"); + break; + case 'd': + /* Full heap debugging - S-L-O-W */ +#ifdef MYMALLOC + mal_debug(3); +#endif + break; + case 'm': + use_mmap = 1; +#ifdef MYMALLOC + mal_mmap(optarg); +#else + complain("-m option needs CSRI malloc"); +#endif + break; + case 'a': + /* Only allocate -- no free */ + alloconly = 1; + break; + case 'v': + verbose++; + break; + case '?': + usage(); + break; + } + } + /* Any filenames etc. after all the options */ + if (optind < argc) { + usage(); + } + + for(t = 0; t < MaxTime; t++) + bufs[t] = 0; + +#ifdef MYMALLOC + before = (* _malloc_memfunc)(0); +#else + before = sbrk(0); +#endif + for(t = 0; t < MaxTime; t++) { + register int n; + + for(n = rnd(NumAllocs) + 1; n > 0; n--) { + int s, l; + + s = rnd(MaxSize) + 2; + l = rnd(MaxLife) + 1; + reserve(s, t + l); + } + if (! alloconly) + freeall(t); + } +#ifdef MYMALLOC + after = (* _malloc_memfunc)(0); +#else + after = sbrk(0); +#endif + grew = after - before; + (void) sprintf(errstring, "Sbrked %ld, MaxAlloced %ld, Wastage %.2f\n", + grew, maxalloced * sizeof(word), + grew == 0 ? 0.0 : + (1.0 - ((double) maxalloced * sizeof(word)) / grew)); + (void) write(1, errstring, strlen(errstring)); +#ifdef MYMALLOC + if (verbose) + (void) mal_statsdump(stderr); +#endif + return 0; +} + +/* + * Mallocs a block s words long, and adds it to the list of blocks to + * be freed at time tfree + */ +void +reserve(s, tfree) +int s; +int tfree; +{ + word *wp; + + wp = (word *) malloc(s * sizeof(word)); + if (wp == NULL) + complain("Out of memory"); + wp[0].ptr = bufs[tfree]; + wp[1].size = s; + bufs[tfree] = wp; + alloced += s; + if (alloced > maxalloced) + maxalloced = alloced; +} + +/* free all blocks whose lifetime expires at time t */ +void +freeall(t) +int t; +{ + word *wp; + + wp = bufs[t]; + while(wp != NULL) { + word *tmp = wp[0].ptr; + alloced -= wp[1].size; + free((char *) wp); + wp = tmp; + } +} diff --git a/lib/libmalloc/tests/t1.c b/lib/libmalloc/tests/t1.c new file mode 100644 index 000000000000..7cdde93e4946 --- /dev/null +++ b/lib/libmalloc/tests/t1.c @@ -0,0 +1,40 @@ +#include <stdio.h> + +#define MAXALLOCS 1000 +#define SIZE 50 + +extern char *sbrk(); +extern char *malloc(); + +main() +{ + char *ptr[MAXALLOCS]; + char *obrk, *nbrk; + int i; + + obrk = sbrk(0); + printf("break is initially 0x%x\n", obrk); + + for(i = 0; i < MAXALLOCS; i++) { + ptr[i] = malloc(SIZE); + } + nbrk = sbrk(0); + printf("break is 0x%x (%d bytes sbrked) after %d allocations of %d\n", + nbrk, nbrk - obrk, MAXALLOCS, SIZE); + for(i = 0; i < MAXALLOCS; i++) { + free(ptr[i]); + } + nbrk = sbrk(0); + printf("break is 0x%x (%d bytes sbrked) after freeing all allocations\n", + nbrk, nbrk - obrk); + fflush(stdout); + + /* Should be enough memory for this without needing to sbrk */ + (void) malloc(SIZE * (MAXALLOCS / 2)); + nbrk = sbrk(0); + + printf("break is 0x%x (%d bytes sbrked) after allocating %d\n", + nbrk, nbrk - obrk, SIZE * (MAXALLOCS/2)); + + exit(0); +} diff --git a/lib/libmalloc/tests/t2.c b/lib/libmalloc/tests/t2.c new file mode 100644 index 000000000000..125c251e42b1 --- /dev/null +++ b/lib/libmalloc/tests/t2.c @@ -0,0 +1,37 @@ +#include <stdio.h> + +#define MAXALLOCS 100 +#define INC 50 + +extern char *sbrk(); +extern char *malloc(); + +main() +{ + char *ptr1, *ptr2; + char *obrk, *nbrk; + int i; + int small = 10; + int large = 128; + + obrk = sbrk(0); + printf("break is initially 0x%x\n", obrk); + + ptr1 = malloc(small); + ptr2 = malloc(small); + for(i = 0; i < MAXALLOCS; i++) { + (void) malloc(small); + free(ptr1); + ptr1 = malloc(large); + large += INC; + (void) malloc(small); + free(ptr2); + ptr2 = malloc(large); + large += INC; + mal_heapdump(stdout); + } + nbrk = sbrk(0); + printf("break is 0x%x (%d bytes sbrked)\n", + nbrk, nbrk - obrk); + exit(0); +} diff --git a/lib/libmalloc/tests/t3.c b/lib/libmalloc/tests/t3.c new file mode 100644 index 000000000000..fdbc181e54f7 --- /dev/null +++ b/lib/libmalloc/tests/t3.c @@ -0,0 +1,110 @@ +/* +Path: utstat!helios.physics.utoronto.ca!jarvis.csri.toronto.edu!mailrus!tut.cis.ohio-state.edu!cs.utexas.edu!rice!sun-spots-request +From: munsell!jwf@uunet.uu.net (Jim Franklin) +Newsgroups: comp.sys.sun +Subject: bug in SUN malloc() +Keywords: Miscellaneous +Message-ID: <4193@brazos.Rice.edu> +Date: 4 Jan 90 13:05:06 GMT +Sender: root@rice.edu +Organization: Sun-Spots +Lines: 95 +Approved: Sun-Spots@rice.edu +X-Sun-Spots-Digest: Volume 9, Issue 4, message 10 of 12 + +There is a bug in SUN's malloc() that causes it to sometimes attempt an +sbrk() to grow the current process, even if there is a free block of the +exact size available. The bug exists in OS 3.5 and 4.0.3, probably +others. + +SUN's malloc() maintains the free list in a cartesian tree. The malloc() +bug occurs when the root block is exactly equal in size to the requested +allocation + alignment + overhead. + +malloc.c (416-427): +> /-* +> * ensure that at least one block is big enough to satisfy +> * the request. +> *-/ +> +> if (weight(_root) <= nbytes) { +> /-* +> * the largest block is not enough. +> *-/ +> if(!morecore(nbytes)) +> return 0; +> } + +The '<=' should be '<'. + +The following 'malloc_bug' program illustrates the bug. Do a 'pstat -s' +to see how much swap space you have, then run malloc_bug, requesting a +chunk of memory at least 1/2 that size. E.g., + +jwf@fechner #36 pstat -s +8856k used (2120k text), 648872k free, 2776k wasted, 0k missing +max process allocable = 229360k +avail: 77*8192k 2*4096k 2*2048k 3*1024k 2*512k 3*256k 4*128k 3*64k 2*32k 4*16k 104*1k + +jwf@fechner #37 malloc_bug 200000000 +malloc_bug: requesting 200000000 bytes +malloc_bug: got 200000000 bytes at 00022fd8 +malloc_bug: freeing 200000000 bytes +malloc_bug: requesting 200000000 bytes +malloc_bug: Not enough memory + + +Jim Franklin, EPPS Inc., uunet!atexnet ---\ +32 Wiggins Ave., harvard!adelie ---+-- munsell!jwf +Bedford, MA 01730 decvax!encore ---/ +(617) 276-7827 + + +*/ +#include <stdio.h> + +main (argc, argv) +int argc; +char **argv; +{ + char *p; + unsigned int size; + int i; + extern char *malloc (); + + if ( argc != 2 ) { + fprintf (stderr, "usage: malloc_bug <chunk_size>\n"); + exit (-1); + } + size = atoi (argv[1]); + /* malloc our large chunk */ + + fprintf (stderr, "malloc_bug: requesting %d bytes\n", size); + p = malloc (size); + if ( p == NULL ) { + perror ("malloc_bug"); + exit (-1); + } + fprintf (stderr, "malloc_bug: got %d bytes at %08x\n", size, p); + + /* malloc a bunch of small trash to + try to use up any free fragments + near the large chunk */ + for ( i = 0; i < 2000; i++ ) + (void) malloc (8); + /* repeatedly free and malloc the + large chunk -- if this fails then + malloc is broken ... */ + for (;;) { + fprintf (stderr, "malloc_bug: freeing %d bytes\n", size); + free (p); + fprintf (stderr, "malloc_bug: requesting %d bytes\n", size); + p = malloc (size); + if ( p == NULL ) { + perror ("malloc_bug"); + exit (-1); + } + fprintf (stderr, "malloc_bug: got %d bytes at %08x\n", size, p); + } + +} /* main */ diff --git a/lib/libmalloc/tests/t4.c b/lib/libmalloc/tests/t4.c new file mode 100644 index 000000000000..45161ad0cd49 --- /dev/null +++ b/lib/libmalloc/tests/t4.c @@ -0,0 +1,20 @@ +int +main() +{ + char *cp; + int i; + int n = getpagesize(); + extern char *malloc(); + + printf("pagesize = %d\n", n); + + for(i = 0; i < 5; i++) { + cp = malloc(n); + printf("malloc(%d) returned 0x%x\n", n, cp); + cp = malloc(2*n); + printf("malloc(%d) returned 0x%x\n", 2*n, cp); + cp = malloc(4*n); + printf("malloc(%d) returned 0x%x\n", 4*n, cp); + } + return 0; +} diff --git a/lib/libmalloc/tests/t5.c b/lib/libmalloc/tests/t5.c new file mode 100644 index 000000000000..f25df6045594 --- /dev/null +++ b/lib/libmalloc/tests/t5.c @@ -0,0 +1,31 @@ +/* + * posted to the net by someone who asked "Why is this causing malloc to + * dump core! Modified slightly to free the pointers, which causes my + * debugging malloc to find the bug. Turning on malloc_debug(2) also + * spots the problem. + */ +#include <stdio.h> + +int +main() +{ + char *p[3], wd[128]; + int len, i; + char *malloc(); + int strlen(); + + strcpy(wd,"test"); + + for (i=0; i<3; i++) { + len = strlen(wd); + if ((p[i] = malloc(len)) == NULL) { + printf("ERROR: malloc failed\n"); + exit(-1); + } + else + strcpy(p[i],wd); + } + for(i=0; i < 3; i++) + free(p[i]); + return 0; +} diff --git a/lib/libmalloc/tests/test.out b/lib/libmalloc/tests/test.out new file mode 100644 index 000000000000..49d51d139cf6 --- /dev/null +++ b/lib/libmalloc/tests/test.out @@ -0,0 +1,415 @@ +Malloc tracing starting +Test starting +testmalloc.c:48:sbrk 4096 +heapstart 0x23108 +heapend 0x24100 ++ 100 100 0x23114 +Heap printout: +Rover pointer is 0x240fc +Arena from 0x23104 to 0x24100, 1024 (0x400) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23178, 28 (0x1c) words really 100 bytes + Free blk: 0x2317c to 0x240fc, 993 (0x3e1) words next=0x240fc, prev=0x240fc +============== +testmalloc.c:51:+ 150 152 0x23184 +Heap printout: +Rover pointer is 0x240fc +Arena from 0x23104 to 0x24100, 1024 (0x400) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23178, 28 (0x1c) words really 100 bytes + Allocated blk: 0x2317c to 0x2321c, 41 (0x29) words really 150 bytes + Free blk: 0x23220 to 0x240fc, 952 (0x3b8) words next=0x240fc, prev=0x240fc +============== +testmalloc.c:54:+ 191 192 0x23228 +Heap printout: +Rover pointer is 0x240fc +Arena from 0x23104 to 0x24100, 1024 (0x400) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23178, 28 (0x1c) words really 100 bytes + Allocated blk: 0x2317c to 0x2321c, 41 (0x29) words really 150 bytes + Allocated blk: 0x23220 to 0x232e8, 51 (0x33) words really 191 bytes + Free blk: 0x232ec to 0x240fc, 901 (0x385) words next=0x240fc, prev=0x240fc +============== +testmalloc.c:57:+ 2 4 0x232f4 +Heap printout: +Rover pointer is 0x240fc +Arena from 0x23104 to 0x24100, 1024 (0x400) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23178, 28 (0x1c) words really 100 bytes + Allocated blk: 0x2317c to 0x2321c, 41 (0x29) words really 150 bytes + Allocated blk: 0x23220 to 0x232e8, 51 (0x33) words really 191 bytes + Allocated blk: 0x232ec to 0x232f8, 4 (0x4) words really 2 bytes + Free blk: 0x232fc to 0x240fc, 897 (0x381) words next=0x240fc, prev=0x240fc +============== +testmalloc.c:60:+ 21 24 0x23304 +Heap printout: +Rover pointer is 0x240fc +Arena from 0x23104 to 0x24100, 1024 (0x400) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23178, 28 (0x1c) words really 100 bytes + Allocated blk: 0x2317c to 0x2321c, 41 (0x29) words really 150 bytes + Allocated blk: 0x23220 to 0x232e8, 51 (0x33) words really 191 bytes + Allocated blk: 0x232ec to 0x232f8, 4 (0x4) words really 2 bytes + Allocated blk: 0x232fc to 0x2331c, 9 (0x9) words really 21 bytes + Free blk: 0x23320 to 0x240fc, 888 (0x378) words next=0x240fc, prev=0x240fc +============== +testmalloc.c:63:+ 3540 3540 0x23328 +Heap printout: +Rover pointer is 0x0 +Arena from 0x23104 to 0x24100, 1024 (0x400) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23178, 28 (0x1c) words really 100 bytes + Allocated blk: 0x2317c to 0x2321c, 41 (0x29) words really 150 bytes + Allocated blk: 0x23220 to 0x232e8, 51 (0x33) words really 191 bytes + Allocated blk: 0x232ec to 0x232f8, 4 (0x4) words really 2 bytes + Allocated blk: 0x232fc to 0x2331c, 9 (0x9) words really 21 bytes + Allocated blk: 0x23320 to 0x240fc, 888 (0x378) words really 3540 bytes +============== +testmalloc.c:67:- 3540 0x23328 +Heap printout: +Rover pointer is 0x240fc +Arena from 0x23104 to 0x24100, 1024 (0x400) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23178, 28 (0x1c) words really 100 bytes + Allocated blk: 0x2317c to 0x2321c, 41 (0x29) words really 150 bytes + Allocated blk: 0x23220 to 0x232e8, 51 (0x33) words really 191 bytes + Allocated blk: 0x232ec to 0x232f8, 4 (0x4) words really 2 bytes + Allocated blk: 0x232fc to 0x2331c, 9 (0x9) words really 21 bytes + Free blk: 0x23320 to 0x240fc, 888 (0x378) words next=0x240fc, prev=0x240fc +============== +testmalloc.c:69:- 192 0x23228 +Heap printout: +Rover pointer is 0x232e8 +Arena from 0x23104 to 0x24100, 1024 (0x400) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23178, 28 (0x1c) words really 100 bytes + Allocated blk: 0x2317c to 0x2321c, 41 (0x29) words really 150 bytes + Free blk: 0x23220 to 0x232e8, 51 (0x33) words next=0x240fc, prev=0x240fc + Allocated blk: 0x232ec to 0x232f8, 4 (0x4) words really 2 bytes + Allocated blk: 0x232fc to 0x2331c, 9 (0x9) words really 21 bytes + Free blk: 0x23320 to 0x240fc, 888 (0x378) words next=0x232e8, prev=0x232e8 +============== +testmalloc.c:71:- 4 0x232f4 +Heap printout: +Rover pointer is 0x232f8 +Arena from 0x23104 to 0x24100, 1024 (0x400) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23178, 28 (0x1c) words really 100 bytes + Allocated blk: 0x2317c to 0x2321c, 41 (0x29) words really 150 bytes + Free blk: 0x23220 to 0x232f8, 55 (0x37) words next=0x240fc, prev=0x240fc + Allocated blk: 0x232fc to 0x2331c, 9 (0x9) words really 21 bytes + Free blk: 0x23320 to 0x240fc, 888 (0x378) words next=0x232f8, prev=0x232f8 +============== +testmalloc.c:73:- 152 0x23184 +Heap printout: +Rover pointer is 0x232f8 +Arena from 0x23104 to 0x24100, 1024 (0x400) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23178, 28 (0x1c) words really 100 bytes + Free blk: 0x2317c to 0x232f8, 96 (0x60) words next=0x240fc, prev=0x240fc + Allocated blk: 0x232fc to 0x2331c, 9 (0x9) words really 21 bytes + Free blk: 0x23320 to 0x240fc, 888 (0x378) words next=0x232f8, prev=0x232f8 +============== +testmalloc.c:75:- 24 0x23304 +Heap printout: +Rover pointer is 0x240fc +Arena from 0x23104 to 0x24100, 1024 (0x400) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23178, 28 (0x1c) words really 100 bytes + Free blk: 0x2317c to 0x240fc, 993 (0x3e1) words next=0x240fc, prev=0x240fc +============== +testmalloc.c:77:- 100 0x23114 +Heap printout: +Rover pointer is 0x240fc +Arena from 0x23104 to 0x24100, 1024 (0x400) words +Next arena is 0x0 + Free blk: 0x2310c to 0x240fc, 1021 (0x3fd) words next=0x240fc, prev=0x240fc +============== +testmalloc.c:79:+ 100 100 0x23114 +Heap printout: +Rover pointer is 0x240fc +Arena from 0x23104 to 0x24100, 1024 (0x400) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23178, 28 (0x1c) words really 100 bytes + Free blk: 0x2317c to 0x240fc, 993 (0x3e1) words next=0x240fc, prev=0x240fc +============== +testmalloc.c:82:+ 155 156 0x23184 +Heap printout: +Rover pointer is 0x240fc +Arena from 0x23104 to 0x24100, 1024 (0x400) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23178, 28 (0x1c) words really 100 bytes + Allocated blk: 0x2317c to 0x23220, 42 (0x2a) words really 155 bytes + Free blk: 0x23224 to 0x240fc, 951 (0x3b7) words next=0x240fc, prev=0x240fc +============== +testmalloc.c:85:sbrk 12288 +- 12276 0x24108 ++ 8192 8192 0x2322c +Heap printout: +Rover pointer is 0x270fc +Arena from 0x23104 to 0x27100, 4096 (0x1000) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23178, 28 (0x1c) words really 100 bytes + Allocated blk: 0x2317c to 0x23220, 42 (0x2a) words really 155 bytes + Allocated blk: 0x23224 to 0x2522c, 2051 (0x803) words really 8192 bytes + Free blk: 0x25230 to 0x270fc, 1972 (0x7b4) words next=0x270fc, prev=0x270fc +============== +testmalloc.c:88:+ 100 100 0x25238 +Heap printout: +Rover pointer is 0x270fc +Arena from 0x23104 to 0x27100, 4096 (0x1000) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23178, 28 (0x1c) words really 100 bytes + Allocated blk: 0x2317c to 0x23220, 42 (0x2a) words really 155 bytes + Allocated blk: 0x23224 to 0x2522c, 2051 (0x803) words really 8192 bytes + Allocated blk: 0x25230 to 0x2529c, 28 (0x1c) words really 100 bytes + Free blk: 0x252a0 to 0x270fc, 1944 (0x798) words next=0x270fc, prev=0x270fc +============== +testmalloc.c:91:+ 29 32 0x252a8 +Heap printout: +Rover pointer is 0x270fc +Arena from 0x23104 to 0x27100, 4096 (0x1000) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23178, 28 (0x1c) words really 100 bytes + Allocated blk: 0x2317c to 0x23220, 42 (0x2a) words really 155 bytes + Allocated blk: 0x23224 to 0x2522c, 2051 (0x803) words really 8192 bytes + Allocated blk: 0x25230 to 0x2529c, 28 (0x1c) words really 100 bytes + Allocated blk: 0x252a0 to 0x252c8, 11 (0xb) words really 29 bytes + Free blk: 0x252cc to 0x270fc, 1933 (0x78d) words next=0x270fc, prev=0x270fc +============== +testmalloc.c:94:- 8192 0x2322c +Heap printout: +Rover pointer is 0x2522c +Arena from 0x23104 to 0x27100, 4096 (0x1000) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23178, 28 (0x1c) words really 100 bytes + Allocated blk: 0x2317c to 0x23220, 42 (0x2a) words really 155 bytes + Free blk: 0x23224 to 0x2522c, 2051 (0x803) words next=0x270fc, prev=0x270fc + Allocated blk: 0x25230 to 0x2529c, 28 (0x1c) words really 100 bytes + Allocated blk: 0x252a0 to 0x252c8, 11 (0xb) words really 29 bytes + Free blk: 0x252cc to 0x270fc, 1933 (0x78d) words next=0x2522c, prev=0x2522c +============== +testmalloc.c:96:- 100 0x25238 +Heap printout: +Rover pointer is 0x2529c +Arena from 0x23104 to 0x27100, 4096 (0x1000) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23178, 28 (0x1c) words really 100 bytes + Allocated blk: 0x2317c to 0x23220, 42 (0x2a) words really 155 bytes + Free blk: 0x23224 to 0x2529c, 2079 (0x81f) words next=0x270fc, prev=0x270fc + Allocated blk: 0x252a0 to 0x252c8, 11 (0xb) words really 29 bytes + Free blk: 0x252cc to 0x270fc, 1933 (0x78d) words next=0x2529c, prev=0x2529c +============== +testmalloc.c:98:- 156 0x23184 +Heap printout: +Rover pointer is 0x2529c +Arena from 0x23104 to 0x27100, 4096 (0x1000) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23178, 28 (0x1c) words really 100 bytes + Free blk: 0x2317c to 0x2529c, 2121 (0x849) words next=0x270fc, prev=0x270fc + Allocated blk: 0x252a0 to 0x252c8, 11 (0xb) words really 29 bytes + Free blk: 0x252cc to 0x270fc, 1933 (0x78d) words next=0x2529c, prev=0x2529c +============== +testmalloc.c:100:- 32 0x252a8 +Heap printout: +Rover pointer is 0x270fc +Arena from 0x23104 to 0x27100, 4096 (0x1000) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23178, 28 (0x1c) words really 100 bytes + Free blk: 0x2317c to 0x270fc, 4065 (0xfe1) words next=0x270fc, prev=0x270fc +============== +testmalloc.c:102:- 100 0x23114 +Heap printout: +Rover pointer is 0x270fc +Arena from 0x23104 to 0x27100, 4096 (0x1000) words +Next arena is 0x0 + Free blk: 0x2310c to 0x270fc, 4093 (0xffd) words next=0x270fc, prev=0x270fc +============== +testmalloc.c:105:+ 1005 1008 0x23114 +Heap printout: +Rover pointer is 0x270fc +Arena from 0x23104 to 0x27100, 4096 (0x1000) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23504, 255 (0xff) words really 1005 bytes + Free blk: 0x23508 to 0x270fc, 3838 (0xefe) words next=0x270fc, prev=0x270fc +============== +testmalloc.c:108:+ 8192 8192 0x23510 +Heap printout: +Rover pointer is 0x270fc +Arena from 0x23104 to 0x27100, 4096 (0x1000) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23504, 255 (0xff) words really 1005 bytes + Allocated blk: 0x23508 to 0x25510, 2051 (0x803) words really 8192 bytes + Free blk: 0x25514 to 0x270fc, 1787 (0x6fb) words next=0x270fc, prev=0x270fc +============== +testmalloc.c:111:sbrk 16384 +heapend 0x2b164 ++ 16000 16000 0x27178 +Heap printout: +Rover pointer is 0x2b160 +Arena from 0x27168 to 0x2b164, 4096 (0x1000) words +Next arena is 0x23104 + Allocated blk: 0x27170 to 0x2aff8, 4003 (0xfa3) words really 16000 bytes + Free blk: 0x2affc to 0x2b160, 90 (0x5a) words next=0x270fc, prev=0x270fc +Arena from 0x23104 to 0x27100, 4096 (0x1000) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23504, 255 (0xff) words really 1005 bytes + Allocated blk: 0x23508 to 0x25510, 2051 (0x803) words really 8192 bytes + Free blk: 0x25514 to 0x270fc, 1787 (0x6fb) words next=0x2b160, prev=0x2b160 +============== +testmalloc.c:114:+ 29 32 0x2b004 +Heap printout: +Rover pointer is 0x2b160 +Arena from 0x27168 to 0x2b164, 4096 (0x1000) words +Next arena is 0x23104 + Allocated blk: 0x27170 to 0x2aff8, 4003 (0xfa3) words really 16000 bytes + Allocated blk: 0x2affc to 0x2b024, 11 (0xb) words really 29 bytes + Free blk: 0x2b028 to 0x2b160, 79 (0x4f) words next=0x270fc, prev=0x270fc +Arena from 0x23104 to 0x27100, 4096 (0x1000) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23504, 255 (0xff) words really 1005 bytes + Allocated blk: 0x23508 to 0x25510, 2051 (0x803) words really 8192 bytes + Free blk: 0x25514 to 0x270fc, 1787 (0x6fb) words next=0x2b160, prev=0x2b160 +============== +testmalloc.c:118:sbrk 77824 +- 77812 0x2b16c ++ 73727 73728 0x2b030 +- 4132 0x3c00c +- 4036 0x2b030 +Heap printout: +Rover pointer is 0x2bff4 +Arena from 0x27168 to 0x3e164, 23552 (0x5c00) words +Next arena is 0x23104 + Allocated blk: 0x27170 to 0x2aff8, 4003 (0xfa3) words really 16000 bytes + Allocated blk: 0x2affc to 0x2b024, 11 (0xb) words really 29 bytes + Free blk: 0x2b028 to 0x2bff4, 1012 (0x3f4) words next=0x3e160, prev=0x270fc + Allocated blk: 0x2bff8 to 0x3c000, 16387 (0x4003) words really 65536 bytes + Free blk: 0x3c004 to 0x3e160, 2136 (0x858) words next=0x270fc, prev=0x2bff4 +Arena from 0x23104 to 0x27100, 4096 (0x1000) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23504, 255 (0xff) words really 1005 bytes + Allocated blk: 0x23508 to 0x25510, 2051 (0x803) words really 8192 bytes + Free blk: 0x25514 to 0x270fc, 1787 (0x6fb) words next=0x2bff4, prev=0x3e160 +============== +testmalloc.c:121:- 57524 0x2df4c +Heap printout: +Rover pointer is 0x3e160 +Arena from 0x27168 to 0x3e164, 23552 (0x5c00) words +Next arena is 0x23104 + Allocated blk: 0x27170 to 0x2aff8, 4003 (0xfa3) words really 16000 bytes + Allocated blk: 0x2affc to 0x2b024, 11 (0xb) words really 29 bytes + Free blk: 0x2b028 to 0x2bff4, 1012 (0x3f4) words next=0x3e160, prev=0x270fc + Allocated blk: 0x2bff8 to 0x2df40, 2003 (0x7d3) words really 8000 bytes + Free blk: 0x2df44 to 0x3e160, 16520 (0x4088) words next=0x270fc, prev=0x2bff4 +Arena from 0x23104 to 0x27100, 4096 (0x1000) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23504, 255 (0xff) words really 1005 bytes + Allocated blk: 0x23508 to 0x25510, 2051 (0x803) words really 8192 bytes + Free blk: 0x25514 to 0x270fc, 1787 (0x6fb) words next=0x2bff4, prev=0x3e160 +============== +testmalloc.c:124:no-op +Heap printout: +Rover pointer is 0x3e160 +Arena from 0x27168 to 0x3e164, 23552 (0x5c00) words +Next arena is 0x23104 + Allocated blk: 0x27170 to 0x2aff8, 4003 (0xfa3) words really 16000 bytes + Allocated blk: 0x2affc to 0x2b024, 11 (0xb) words really 29 bytes + Free blk: 0x2b028 to 0x2bff4, 1012 (0x3f4) words next=0x3e160, prev=0x270fc + Allocated blk: 0x2bff8 to 0x2df40, 2003 (0x7d3) words really 7998 bytes + Free blk: 0x2df44 to 0x3e160, 16520 (0x4088) words next=0x270fc, prev=0x2bff4 +Arena from 0x23104 to 0x27100, 4096 (0x1000) words +Next arena is 0x0 + Allocated blk: 0x2310c to 0x23504, 255 (0xff) words really 1005 bytes + Allocated blk: 0x23508 to 0x25510, 2051 (0x803) words really 8192 bytes + Free blk: 0x25514 to 0x270fc, 1787 (0x6fb) words next=0x2bff4, prev=0x3e160 +============== +testmalloc.c:127:- 1008 0x23114 +Heap printout: +Rover pointer is 0x23504 +Arena from 0x27168 to 0x3e164, 23552 (0x5c00) words +Next arena is 0x23104 + Allocated blk: 0x27170 to 0x2aff8, 4003 (0xfa3) words really 16000 bytes + Allocated blk: 0x2affc to 0x2b024, 11 (0xb) words really 29 bytes + Free blk: 0x2b028 to 0x2bff4, 1012 (0x3f4) words next=0x23504, prev=0x270fc + Allocated blk: 0x2bff8 to 0x2df40, 2003 (0x7d3) words really 7998 bytes + Free blk: 0x2df44 to 0x3e160, 16520 (0x4088) words next=0x270fc, prev=0x23504 +Arena from 0x23104 to 0x27100, 4096 (0x1000) words +Next arena is 0x0 + Free blk: 0x2310c to 0x23504, 255 (0xff) words next=0x3e160, prev=0x2bff4 + Allocated blk: 0x23508 to 0x25510, 2051 (0x803) words really 8192 bytes + Free blk: 0x25514 to 0x270fc, 1787 (0x6fb) words next=0x2bff4, prev=0x3e160 +============== +testmalloc.c:129:- 8192 0x23510 +Heap printout: +Rover pointer is 0x270fc +Arena from 0x27168 to 0x3e164, 23552 (0x5c00) words +Next arena is 0x23104 + Allocated blk: 0x27170 to 0x2aff8, 4003 (0xfa3) words really 16000 bytes + Allocated blk: 0x2affc to 0x2b024, 11 (0xb) words really 29 bytes + Free blk: 0x2b028 to 0x2bff4, 1012 (0x3f4) words next=0x3e160, prev=0x270fc + Allocated blk: 0x2bff8 to 0x2df40, 2003 (0x7d3) words really 7998 bytes + Free blk: 0x2df44 to 0x3e160, 16520 (0x4088) words next=0x270fc, prev=0x2bff4 +Arena from 0x23104 to 0x27100, 4096 (0x1000) words +Next arena is 0x0 + Free blk: 0x2310c to 0x270fc, 4093 (0xffd) words next=0x2bff4, prev=0x3e160 +============== +testmalloc.c:131:- 32 0x2b004 +Heap printout: +Rover pointer is 0x2bff4 +Arena from 0x27168 to 0x3e164, 23552 (0x5c00) words +Next arena is 0x23104 + Allocated blk: 0x27170 to 0x2aff8, 4003 (0xfa3) words really 16000 bytes + Free blk: 0x2affc to 0x2bff4, 1023 (0x3ff) words next=0x3e160, prev=0x270fc + Allocated blk: 0x2bff8 to 0x2df40, 2003 (0x7d3) words really 7998 bytes + Free blk: 0x2df44 to 0x3e160, 16520 (0x4088) words next=0x270fc, prev=0x2bff4 +Arena from 0x23104 to 0x27100, 4096 (0x1000) words +Next arena is 0x0 + Free blk: 0x2310c to 0x270fc, 4093 (0xffd) words next=0x2bff4, prev=0x3e160 +============== +testmalloc.c:133:- 16000 0x27178 +Heap printout: +Rover pointer is 0x2bff4 +Arena from 0x27168 to 0x3e164, 23552 (0x5c00) words +Next arena is 0x23104 + Free blk: 0x27170 to 0x2bff4, 5026 (0x13a2) words next=0x3e160, prev=0x270fc + Allocated blk: 0x2bff8 to 0x2df40, 2003 (0x7d3) words really 7998 bytes + Free blk: 0x2df44 to 0x3e160, 16520 (0x4088) words next=0x270fc, prev=0x2bff4 +Arena from 0x23104 to 0x27100, 4096 (0x1000) words +Next arena is 0x0 + Free blk: 0x2310c to 0x270fc, 4093 (0xffd) words next=0x2bff4, prev=0x3e160 +============== +testmalloc.c:135:++ 16000 16000 0x2c000 58080 0x2fe84 +Heap printout: +Rover pointer is 0x2bff4 +Arena from 0x27168 to 0x3e164, 23552 (0x5c00) words +Next arena is 0x23104 + Free blk: 0x27170 to 0x2bff4, 5026 (0x13a2) words next=0x3e160, prev=0x270fc + Allocated blk: 0x2bff8 to 0x2fe80, 4003 (0xfa3) words really 16000 bytes + Free blk: 0x2fe84 to 0x3e160, 14520 (0x38b8) words next=0x270fc, prev=0x2bff4 +Arena from 0x23104 to 0x27100, 4096 (0x1000) words +Next arena is 0x0 + Free blk: 0x2310c to 0x270fc, 4093 (0xffd) words next=0x2bff4, prev=0x3e160 +============== +testmalloc.c:138:++ 32000 32000 0x2c000 42080 0x33d04 +Heap printout: +Rover pointer is 0x2bff4 +Arena from 0x27168 to 0x3e164, 23552 (0x5c00) words +Next arena is 0x23104 + Free blk: 0x27170 to 0x2bff4, 5026 (0x13a2) words next=0x3e160, prev=0x270fc + Allocated blk: 0x2bff8 to 0x33d00, 8003 (0x1f43) words really 32000 bytes + Free blk: 0x33d04 to 0x3e160, 10520 (0x2918) words next=0x270fc, prev=0x2bff4 +Arena from 0x23104 to 0x27100, 4096 (0x1000) words +Next arena is 0x0 + Free blk: 0x2310c to 0x270fc, 4093 (0xffd) words next=0x2bff4, prev=0x3e160 +============== +16: 1 +36: 1 +44: 2 +112: 3 +164: 1 +168: 1 +204: 1 +1020: 1 +3552: 1 +>= 8192: 4 +Test done diff --git a/lib/libmalloc/tests/testmalloc.c b/lib/libmalloc/tests/testmalloc.c new file mode 100644 index 000000000000..d037b5e1bf00 --- /dev/null +++ b/lib/libmalloc/tests/testmalloc.c @@ -0,0 +1,182 @@ +#if defined(STDHEADERS) +# include <stddef.h> +# include <string.h> +# include <stdlib.h> +# include <unistd.h> +#else +# define u_int unsigned int +extern char *memset(); +/* ignore some complaints about declarations. get ANSI headers */ +#endif + +#include <stdio.h> +#include "malloc.h" + +/* + * Things to test. 1. first malloc. 2. couple of ordinary mallocs 3. + * ordinary frees 4. want check a free with prev. merge, next merge, + * both, and no merge, and one with empty free list. 5. malloc that + * requires sbrk. 6. malloc that requires an sbrk, after test + * program does non-contiguous sbrk to check if non-contigous arenas + * work. 7. valloc (this should test memalign as well) We should work + * out tests to check boundary conditions, when blocks at the start + * of the arena are allocated/freed, last free block is allocated... + */ + + +char *progname; +/* For getopt() */ +extern int getopt(); +extern int optind; +extern char *optarg; + +int +main(argc, argv) +int argc; +char **argv; +{ + char *cp1; + char *cp2; + char *cp3; + char *cp4; + char *cp5; + char *cp6; + extern char *sbrk(); + FILE *dumpfp = stdout; + int errs = 0, c; + + progname = argv[0] ? argv[0] : "(no-argv[0])"; + mal_debug(3); + mal_setstatsfile(stdout); + mal_trace(1); + while((c = getopt(argc, argv, "m:")) != EOF) { + /* optarg has the current argument if the option was followed by ':'*/ + switch (c) { + case 'm': + mal_mmap(optarg); + break; + case '?': + errs++; + break; + } + } + if (optind < argc || errs > 0) { + fprintf(stderr, "Usage: %s [-m Mmapfile]\n", progname); + exit(1); + } + write(1, "Test starting\n", 14); + cp1 = (char *)malloc((u_int) 100); + (void) memset(cp1, 'A', 100); + mal_heapdump(dumpfp); + cp2 = (char *)calloc((u_int) 15, (u_int) 10); + (void) memset(cp2, 'B', 150); + mal_heapdump(dumpfp); + cp3 = (char *)malloc((u_int) 191); + (void) memset(cp3, 'C', 191); + mal_heapdump(dumpfp); + cp4 = (char *)malloc((u_int) 2); + (void) memset(cp4, 'D', 2); + mal_heapdump(dumpfp); + cp5 = (char *)malloc((u_int) 21); + (void) memset(cp5, 'E', 21); + mal_heapdump(dumpfp); + cp6 = (char *)malloc((u_int) 3540); + (void) memset(cp6, 'P', 3540); + mal_heapdump(dumpfp); + /* On a machine where sizeof(Word) == 4, rover should be NULL here */ + free(cp6); + mal_heapdump(dumpfp); + free(cp3); + mal_heapdump(dumpfp); + free(cp4); + mal_heapdump(dumpfp); + free(cp2); + mal_heapdump(dumpfp); + free(cp5); + mal_heapdump(dumpfp); + free(cp1); + mal_heapdump(dumpfp); + cp1 = (char *)malloc((u_int) 100); + (void) memset(cp1, 'Q', 100); + mal_heapdump(dumpfp); + cp2 = (char *)malloc((u_int) 155); + (void) memset(cp2, 'F', 155); + mal_heapdump(dumpfp); + cp3 = (char *)malloc((u_int) 8192); + (void) memset(cp3, 'G', 8192); + mal_heapdump(dumpfp); + cp4 = (char *)malloc((u_int) 100); + (void) memset(cp4, 'H', 100); + mal_heapdump(dumpfp); + cp5 = (char *)malloc((u_int) 29); + (void) memset(cp5, 'I', 29); + mal_heapdump(dumpfp); + free(cp3); + mal_heapdump(dumpfp); + free(cp4); + mal_heapdump(dumpfp); + free(cp2); + mal_heapdump(dumpfp); + free(cp5); + mal_heapdump(dumpfp); + free(cp1); + mal_heapdump(dumpfp); + cp1 = sbrk(100); + cp2 = (char *)malloc((u_int) 1005); + (void) memset(cp2, 'J', 1005); + mal_heapdump(dumpfp); + cp3 = (char *)calloc((u_int) 1024, (u_int) 8); + (void) memset(cp3, 'K', 8192); + mal_heapdump(dumpfp); + cp4 = (char *)malloc((u_int) 16000); + (void) memset(cp4, 'L', 16000); + mal_heapdump(dumpfp); + cp5 = (char *)malloc((u_int) 29); + (void) memset(cp5, 'M', 29); + mal_heapdump(dumpfp); + /* !! Should really test memalign with various cases */ + cp1 = (char *)valloc((u_int) 65536); + (void) memset(cp1, 'N', 65536); + mal_heapdump(dumpfp); + cp1 = (char *)realloc(cp1, (u_int) 8000); + (void) memset(cp1, 'O', 8000); + mal_heapdump(dumpfp); + cp1 = (char *)realloc(cp1, (u_int) 7998); + (void) memset(cp1, 'T', 7998); + mal_heapdump(dumpfp); + free(cp2); + mal_heapdump(dumpfp); + free(cp3); + mal_heapdump(dumpfp); + free(cp5); + mal_heapdump(dumpfp); + free(cp4); + mal_heapdump(dumpfp); + cp1 = (char *)realloc(cp1, (u_int) 16000); + (void) memset(cp1, 'R', 16000); + mal_heapdump(dumpfp); + cp1 = (char *)realloc(cp1, (u_int) 32000); + (void) memset(cp1, 'S', 32000); + mal_heapdump(dumpfp); + cp1 = (char *)realloc(cp1, (u_int) 1); + (void) memset(cp1, 'U', 1); + cp2 = (char *)malloc(60000); + (void) memset(cp2, 'V', 60000); + cp3 = (char *)malloc(18000); + (void) memset(cp3, 'W', 18000); + cp4 = (char *)malloc(18000); + (void) memset(cp4, 'W', 18000); + mal_heapdump(dumpfp); + free(cp1); + mal_heapdump(dumpfp); + mal_statsdump(dumpfp); + (void) write(1, "Test done\n", 10); + return 0; +} + +#ifdef atarist +getpagesize() +{ + return 8 * 1024; +} +#endif diff --git a/lib/libmalloc/tests/testmemalign.c b/lib/libmalloc/tests/testmemalign.c new file mode 100644 index 000000000000..2a5a729a9675 --- /dev/null +++ b/lib/libmalloc/tests/testmemalign.c @@ -0,0 +1,16 @@ +int +main() +{ + extern char *memalign(); + char *cp; + + if ((cp = memalign(2, 1024)) == 0) + perror("memalign 2"); + if ((cp = memalign(3, 1024)) == 0) + perror("memalign 3"); + if ((cp = memalign(4, 1024)) == 0) + perror("memalign 4"); + + return 0; +} + diff --git a/lib/libmalloc/tests/testrun.sh b/lib/libmalloc/tests/testrun.sh new file mode 100755 index 000000000000..9da9568d2cdf --- /dev/null +++ b/lib/libmalloc/tests/testrun.sh @@ -0,0 +1,28 @@ +#! /bin/sh +time=time +awk 'BEGIN { + maxtime = 15000; + maxsize = 610; isize = 50; + maxlife = 8010; ilife = 100; + hdrfmt = "echo \"Maxtime = %d, Maxsize = %d, Maxlife = %d\"\n"; + fmt = "$time $cmd -t %d -s %d -l %d\n"; + } + END { + for (i = 10; i < maxsize; i += isize) { + for (j = 10; j < maxlife; j += ilife) { + printf hdrfmt, maxtime, i, j; + printf fmt, maxtime, i, j; + printf fmt, maxtime, i, j; + printf fmt, maxtime, i, j; + } + } + }' /dev/null > /tmp/runs.$$ +for i +do + ext=`expr "$i" : "simumalloc.exe\(.*\)"` + date + echo $i + cmd="./$i" + . /tmp/runs.$$ > times$ext 2>&1 + date +done diff --git a/lib/libmalloc/tests/testsbrk.c b/lib/libmalloc/tests/testsbrk.c new file mode 100644 index 000000000000..ff6c68d1bb45 --- /dev/null +++ b/lib/libmalloc/tests/testsbrk.c @@ -0,0 +1,22 @@ +#include <stdio.h> + +int incr = 201; +char *cp; +int i; + +main() +{ + extern char *sbrk(); + int sz; + + sz = getpagesize(); + printf("pagesize is 0x%08x (%d)\n", sz, sz); + for(i = 0; i < 1000; i++) { + if ((cp = sbrk(incr)) == (char *) -1) { + fprintf(stderr, "Cannot sbrk further\n"); + exit(-1); + } + printf("segment starts at 0x%08x, ends at 0x%08x\n", (int) cp, + (int) (cp + incr - 1)); + } +} diff --git a/lib/libmalloc/tests/teststomp.c b/lib/libmalloc/tests/teststomp.c new file mode 100644 index 000000000000..c591921144a9 --- /dev/null +++ b/lib/libmalloc/tests/teststomp.c @@ -0,0 +1,34 @@ +#if defined(STDHEADERS) +# include <stddef.h> +# include <string.h> +# include <stdlib.h> +# include <unistd.h> +#else +# define u_int unsigned int +extern char *memset(); +/* ignore some complaints about declarations. get ANSI headers */ +#endif + +#include <stdio.h> +#include "malloc.h" + +int +main(argc, argv) +char **argv; +int argc; +{ + char *cp; + int nbytes; + + if (argc != 2) { + (void) fprintf(stderr, "Usage: %s nbytes\n", argv[0]); + exit(1); + } + + nbytes = atoi(argv[1]); + cp = (char *) malloc(nbytes); + cp[nbytes] = 'a'; + mal_verify(1); + /* We aren't going to get here, y'know... */ + return 0; +} |