4 #include "malloc_impl.h"
6 void *__memalign(size_t align, size_t len)
8 unsigned char *mem, *new;
10 if ((align & -align) != align) {
15 if (len > SIZE_MAX - align || __malloc_replaced) {
20 if (align <= SIZE_ALIGN)
23 if (!(mem = malloc(len + align-1)))
26 new = (void *)((uintptr_t)mem + align-1 & -align);
27 if (new == mem) return mem;
29 struct chunk *c = MEM_TO_CHUNK(mem);
30 struct chunk *n = MEM_TO_CHUNK(new);
33 /* Apply difference between aligned and original
34 * address to the "extra" field of mmapped chunk. */
35 n->psize = c->psize + (new-mem);
36 n->csize = c->csize - (new-mem);
40 struct chunk *t = NEXT_CHUNK(c);
42 /* Split the allocated chunk into two chunks. The aligned part
43 * that will be used has the size in its footer reduced by the
44 * difference between the aligned and original addresses, and
45 * the resulting size copied to its header. A new header and
46 * footer are written for the split-off part to be freed. */
47 n->psize = c->csize = C_INUSE | (new-mem);
48 n->csize = t->psize -= new-mem;
54 weak_alias(__memalign, memalign);