1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
#include <malloc.h> /* memalign */
#include <stdlib.h> /* malloc, free */
#include <stddef.h> /* NULL, size_t */
#include <stdint.h> /* uintptr_t */
#include <string.h> /* memcpy */
#include <unistd.h> /* sysconf */
#ifdef __cplusplus
extern "C" {
#endif
void* realloc(void* ptr, size_t size) {
if(ptr == NULL)
return malloc(size);
void* new_ptr = malloc(size);
// this may copies to much
memcpy(new_ptr, ptr, size);
return new_ptr;
}
int posix_memalign(void **memptr, size_t alignment, size_t size)
{
void *out;
if((alignment % sizeof(void*)) != 0) {
return 22;
}
/* if not power of two */
if(!((alignment != 0) && !(alignment & (alignment - 1)))) {
return 22;
}
if(size == 0) {
*memptr = NULL;
return 0;
}
out = malloc(size);
if(out == NULL) {
return 12;
}
*memptr = out;
return 0;
}
void* calloc(size_t nmemb, size_t size)
{
void *out;
size_t fullsize = nmemb * size;
if((size != 0) && ((fullsize / size) != nmemb)) {
return NULL;
}
out = malloc(fullsize);
if(out == NULL) {
return NULL;
}
memset(out, 0, fullsize);
return out;
}
void* valloc(size_t size)
{
long ret = sysconf(_SC_PAGESIZE);
if(ret == -1) {
return NULL;
}
return memalign(ret, size);
}
void* pvalloc(size_t size)
{
size_t ps, rem, allocsize;
long ret = sysconf(_SC_PAGESIZE);
if(ret == -1) {
return NULL;
}
ps = ret;
rem = size % ps;
allocsize = size;
if(rem != 0) {
allocsize = ps + (size - rem);
}
return memalign(ps, allocsize);
}
void* aligned_alloc(size_t alignment, size_t size)
{
if(alignment > size) {
return NULL;
}
if((size % alignment) != 0) {
return NULL;
}
return memalign(alignment, size);
}
#ifdef __cplusplus
}
#endif
|