6 void __internal_free(void *);
8 void *__memalign(size_t align
, size_t len
)
10 unsigned char *mem
, *new, *end
;
11 size_t header
, footer
;
13 if ((align
& -align
) != align
) {
18 if (len
> SIZE_MAX
- align
|| free
!= __internal_free
) {
23 if (align
<= 4*sizeof(size_t)) {
24 if (!(mem
= malloc(len
)))
29 if (!(mem
= malloc(len
+ align
-1)))
32 new = (void *)((uintptr_t)mem
+ align
-1 & -align
);
33 if (new == mem
) return mem
;
35 header
= ((size_t *)mem
)[-1];
38 ((size_t *)new)[-2] = ((size_t *)mem
)[-2] + (new-mem
);
39 ((size_t *)new)[-1] = ((size_t *)mem
)[-1] - (new-mem
);
43 end
= mem
+ (header
& -8);
44 footer
= ((size_t *)end
)[-2];
46 ((size_t *)mem
)[-1] = header
&7 | new-mem
;
47 ((size_t *)new)[-2] = footer
&7 | new-mem
;
48 ((size_t *)new)[-1] = header
&7 | end
-new;
49 ((size_t *)end
)[-2] = footer
&7 | end
-new;
55 weak_alias(__memalign
, memalign
);