Last change
on this file since 373 was 352, checked in by coas-nagasima, 6 years ago |
arm向けASP3版ECNLを追加
|
-
Property svn:eol-style
set to
native
-
Property svn:mime-type
set to
text/x-csrc;charset=UTF-8
|
File size:
1.2 KB
|
Line | |
---|
1 | #include <stdlib.h>
|
---|
2 | #include <stdint.h>
|
---|
3 | #include <errno.h>
|
---|
4 | #include "libc.h"
|
---|
5 |
|
---|
6 | /* This function should work with most dlmalloc-like chunk bookkeeping
|
---|
7 | * systems, but it's only guaranteed to work with the native implementation
|
---|
8 | * used in this library. */
|
---|
9 |
|
---|
10 | void *__memalign(size_t align, size_t len)
|
---|
11 | {
|
---|
12 | unsigned char *mem, *new, *end;
|
---|
13 | size_t header, footer;
|
---|
14 |
|
---|
15 | if ((align & -align) != align) {
|
---|
16 | errno = EINVAL;
|
---|
17 | return NULL;
|
---|
18 | }
|
---|
19 |
|
---|
20 | if (len > SIZE_MAX - align) {
|
---|
21 | errno = ENOMEM;
|
---|
22 | return NULL;
|
---|
23 | }
|
---|
24 |
|
---|
25 | if (align <= 4*sizeof(size_t)) {
|
---|
26 | if (!(mem = malloc(len)))
|
---|
27 | return NULL;
|
---|
28 | return mem;
|
---|
29 | }
|
---|
30 |
|
---|
31 | if (!(mem = malloc(len + align-1)))
|
---|
32 | return NULL;
|
---|
33 |
|
---|
34 | new = (void *)((uintptr_t)mem + align-1 & -align);
|
---|
35 | if (new == mem) return mem;
|
---|
36 |
|
---|
37 | header = ((size_t *)mem)[-1];
|
---|
38 |
|
---|
39 | if (!(header & 7)) {
|
---|
40 | ((size_t *)new)[-2] = ((size_t *)mem)[-2] + (new-mem);
|
---|
41 | ((size_t *)new)[-1] = ((size_t *)mem)[-1] - (new-mem);
|
---|
42 | return new;
|
---|
43 | }
|
---|
44 |
|
---|
45 | end = mem + (header & -8);
|
---|
46 | footer = ((size_t *)end)[-2];
|
---|
47 |
|
---|
48 | ((size_t *)mem)[-1] = header&7 | new-mem;
|
---|
49 | ((size_t *)new)[-2] = footer&7 | new-mem;
|
---|
50 | ((size_t *)new)[-1] = header&7 | end-new;
|
---|
51 | ((size_t *)end)[-2] = footer&7 | end-new;
|
---|
52 |
|
---|
53 | free(mem);
|
---|
54 | return new;
|
---|
55 | }
|
---|
56 |
|
---|
57 | weak_alias(__memalign, memalign);
|
---|
Note:
See
TracBrowser
for help on using the repository browser.