2005-02-21 Alan Modra <amodra@bigpond.net.au>
[glibc/history.git] / malloc / tst-obstack.c
blob769697f185baa04e294124c2b0e652e5fc2e4083
1 /* Test case by Alexandre Duret-Lutz <duret_g@epita.fr>. */
2 #include <obstack.h>
3 #include <stdint.h>
4 #include <stdio.h>
5 #include <stdlib.h>
7 #define obstack_chunk_alloc verbose_malloc
8 #define obstack_chunk_free verbose_free
9 #define ALIGN_BOUNDARY 64
10 #define ALIGN_MASK (ALIGN_BOUNDARY - 1)
11 #define OBJECT_SIZE 1000
13 static void *
14 verbose_malloc (size_t size)
16 void *buf = malloc (size);
17 printf ("malloc (%zu) => %p\n", size, buf);
18 return buf;
21 static void
22 verbose_free (void *buf)
24 free (buf);
25 printf ("free (%p)\n", buf);
28 int
29 main (void)
31 int result = 0;
32 int align = 2;
34 while (align <= 64)
36 struct obstack obs;
37 int i;
38 int align_mask = align - 1;
40 printf ("\n Alignment mask: %d\n", align_mask);
42 obstack_init (&obs);
43 obstack_alignment_mask (&obs) = align_mask;
44 /* finish an empty object to take alignment into account */
45 obstack_finish (&obs);
47 /* let's allocate some objects and print their addresses */
48 for (i = 15; i > 0; --i)
50 void *obj = obstack_alloc (&obs, OBJECT_SIZE);
52 printf ("obstack_alloc (%u) => %p \t%s\n", OBJECT_SIZE, obj,
53 ((uintptr_t) obj & align_mask) ? "(not aligned)" : "");
54 result |= ((uintptr_t) obj & align_mask) != 0;
57 /* clean up */
58 obstack_free (&obs, 0);
60 align <<= 1;
63 return result;