| /* Test case by Alexandre Duret-Lutz <duret_g@epita.fr>. */ |
| #include <obstack.h> |
| #include <stdint.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| #define obstack_chunk_alloc verbose_malloc |
| #define obstack_chunk_free verbose_free |
| #define ALIGN_BOUNDARY 64 |
| #define ALIGN_MASK (ALIGN_BOUNDARY - 1) |
| #define OBJECT_SIZE 1000 |
| |
| static void * |
| verbose_malloc (size_t size) |
| { |
| void *buf = malloc (size); |
| printf ("malloc (%zu) => %p\n", size, buf); |
| return buf; |
| } |
| |
| static void |
| verbose_free (void *buf) |
| { |
| free (buf); |
| printf ("free (%p)\n", buf); |
| } |
| |
| int |
| main (void) |
| { |
| int result = 0; |
| int align = 2; |
| |
| while (align <= 64) |
| { |
| struct obstack obs; |
| int i; |
| int align_mask = align - 1; |
| |
| printf ("\n Alignment mask: %d\n", align_mask); |
| |
| obstack_init (&obs); |
| obstack_alignment_mask (&obs) = align_mask; |
| /* finish an empty object to take alignment into account */ |
| obstack_finish (&obs); |
| |
| /* let's allocate some objects and print their addresses */ |
| for (i = 15; i > 0; --i) |
| { |
| void *obj = obstack_alloc (&obs, OBJECT_SIZE); |
| |
| printf ("obstack_alloc (%u) => %p \t%s\n", OBJECT_SIZE, obj, |
| ((uintptr_t) obj & align_mask) ? "(not aligned)" : ""); |
| result |= ((uintptr_t) obj & align_mask) != 0; |
| } |
| |
| /* clean up */ |
| obstack_free (&obs, 0); |
| |
| align <<= 1; |
| } |
| |
| return result; |
| } |