summaryrefslogtreecommitdiffstats
path: root/winsup/mingw/mingwex/tst-aligned-malloc.c
diff options
context:
space:
mode:
authorDanny Smith <dannysmith@users.sourceforge.net>2004-08-24 08:55:42 +0000
committerDanny Smith <dannysmith@users.sourceforge.net>2004-08-24 08:55:42 +0000
commita6c2ea7e7c363f691fc4dc683c0772b3dab2db70 (patch)
tree2dcf0f2de94d02565181d94366cab207d200fa37 /winsup/mingw/mingwex/tst-aligned-malloc.c
parent45b1139e413d3939436dac636991a5bbbfd7e9ad (diff)
downloadcygnal-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-xwinsup/mingw/mingwex/tst-aligned-malloc.c90
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;
+}