MCPcopy Index your code
hub / github.com/dcodeIO/webassembly / memalign

Function memalign

lib/memalign.c:26–71  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

24*/
25
26void *memalign(size_t align, size_t len)
27{
28 unsigned char *mem, *new, *end;
29 size_t header, footer;
30
31 if ((align & -align) != align) {
32 errno = EINVAL;
33 return NULL;
34 }
35
36 if (len > SIZE_MAX - align) {
37 errno = ENOMEM;
38 return NULL;
39 }
40
41 if (align <= 4*sizeof(size_t)) {
42 if (!(mem = malloc(len)))
43 return NULL;
44 return mem;
45 }
46
47 if (!(mem = malloc(len + align-1)))
48 return NULL;
49
50 new = (void *)((uintptr_t)mem + align-1 & -align);
51 if (new == mem) return mem;
52
53 header = ((size_t *)mem)[-1];
54
55 if (!(header & 7)) {
56 ((size_t *)new)[-2] = ((size_t *)mem)[-2] + (new-mem);
57 ((size_t *)new)[-1] = ((size_t *)mem)[-1] - (new-mem);
58 return new;
59 }
60
61 end = mem + (header & -8);
62 footer = ((size_t *)end)[-2];
63
64 ((size_t *)mem)[-1] = (header&7) | new-mem;
65 ((size_t *)new)[-2] = (footer&7) | new-mem;
66 ((size_t *)new)[-1] = (header&7) | end-new;
67 ((size_t *)end)[-2] = (footer&7) | end-new;
68
69 free(mem);
70 return new;
71}

Callers

nothing calls this directly

Calls 2

mallocFunction · 0.85
freeFunction · 0.85

Tested by

no test coverage detected