diff options
author | Danny Smith <dannysmith@users.sourceforge.net> | 2004-08-24 08:55:42 +0000 |
---|---|---|
committer | Danny Smith <dannysmith@users.sourceforge.net> | 2004-08-24 08:55:42 +0000 |
commit | a6c2ea7e7c363f691fc4dc683c0772b3dab2db70 (patch) | |
tree | 2dcf0f2de94d02565181d94366cab207d200fa37 /winsup/mingw/mingwex/tst-aligned-malloc.c | |
parent | 45b1139e413d3939436dac636991a5bbbfd7e9ad (diff) | |
download | cygnal-a6c2ea7e7c363f691fc4dc683c0772b3dab2db70.tar.gz cygnal-a6c2ea7e7c363f691fc4dc683c0772b3dab2db70.tar.bz2 cygnal-a6c2ea7e7c363f691fc4dc683c0772b3dab2db70.zip |
2004-08-24 Steven G. Johnson <stevenj@alum.mit.edu>
* mingwex/mingw-aligned-malloc.c: New file.
* mingwex/tst-aligned-malloc.c: New file.
Diffstat (limited to 'winsup/mingw/mingwex/tst-aligned-malloc.c')
-rwxr-xr-x | winsup/mingw/mingwex/tst-aligned-malloc.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/winsup/mingw/mingwex/tst-aligned-malloc.c b/winsup/mingw/mingwex/tst-aligned-malloc.c new file mode 100755 index 000000000..43ee734bc --- /dev/null +++ b/winsup/mingw/mingwex/tst-aligned-malloc.c @@ -0,0 +1,90 @@ +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <string.h> +#include <errno.h> +#include <malloc.h> + +#ifdef HAVE_STDINT_H +# include <stdint.h> /* uintptr_t */ +#else +# define uintptr_t size_t +#endif + +#define NELEM(a) (sizeof(a) / sizeof(a[0])) + +static int +is_aligned (void *p, size_t alignment, size_t offset) +{ + return !((((uintptr_t) p) + offset) & (alignment - 1)); +} + +#define MAX_SIZE (1 << sizeof(unsigned char)) +#define NP 1000 +#define NTST 100000U + +#define ERRMSG fprintf(stderr, "Iteration %u, align = %u, offset = %u, size = %u (oldsize = %u), errno = %d (%s)\n", i, align[j % NELEM(align)], offset[j % NELEM(offset)], size[j], oldsize, errno, strerror(errno)) + +int +main (void) +{ + unsigned char *p[NP]; + size_t size[NP]; + size_t align[] = { 2, 4, 8, 16, 32, 64 }; + size_t offset[20]; + unsigned i; + + srand (time (NULL)); + + for (i = 0; i < NELEM (p); ++i) + { + p[i] = 0; + size[i] = 0; + } + + for (i = 0; i < NELEM (offset); ++i) + offset[i] = rand () % 512; + + for (i = 0; i < NTST; ++i) + { + size_t oldsize; + unsigned j, k; + j = rand () % NELEM (p); + oldsize = size[j]; + p[j] = __mingw_aligned_offset_realloc (p[j], + size[j] = rand () % MAX_SIZE, + align[j % NELEM (align)], + offset[j % NELEM (offset)]); + + if (size[j] && !p[j]) + { + fprintf (stderr, "Returned NULL!\n"); + ERRMSG; + return EXIT_FAILURE; + } + if (size[j] && !is_aligned (p[j], + align[j % NELEM (align)], + offset[j % NELEM (offset)])) + { + fprintf (stderr, "Misaligned block!\n"); + ERRMSG; + return EXIT_FAILURE; + } + if (oldsize > size[j]) + oldsize = size[j]; + for (k = 0; k < oldsize; ++k) + if (p[j][k] != k) + { + fprintf (stderr, "Miscopied block!\n"); + ERRMSG; + return EXIT_FAILURE; + } + for (k = 0; k < size[j]; ++k) + p[j][k] = k; + } + + for (i = 0; i < NELEM (p); ++i) + __mingw_aligned_free (p[i]); + + return EXIT_SUCCESS; +} |