-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathbunchalloc.c
More file actions
70 lines (53 loc) · 1.42 KB
/
bunchalloc.c
File metadata and controls
70 lines (53 loc) · 1.42 KB
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
#include"bunchalloc.h"
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stddef.h>
static size_t make_padded(size_t unpadded, size_t alignment)
{
return ((unpadded - 1) / alignment + 1) * alignment;
}
void* bunchalloc(size_t alignment, size_t headersize, ...)
{
size_t i, count = 0;
size_t member_offset, desired_size;;
size_t padded_size = 0;
size_t cur_offset = 0, cur_size;
void* ret = NULL;
va_list ap;
if (!alignment) alignment = sizeof(size_t) * 2;
cur_size = make_padded(headersize, alignment);
va_start(ap, headersize);
for(;;)
{
member_offset = va_arg(ap, size_t);
desired_size = va_arg(ap, size_t);
if (!desired_size) break;
count += 1;
padded_size = make_padded(desired_size, alignment);
cur_offset = cur_size;
cur_size += padded_size;
};
va_end(ap);
ret = malloc(cur_size);
if (!ret) return NULL;
memset(ret, 0, cur_size);
va_start(ap, headersize);
// Align body data to an aligned address
cur_size = make_padded(headersize, alignment);
for (i = 0; i < count; i++)
{
member_offset = va_arg(ap, size_t);
desired_size = va_arg(ap, size_t);
padded_size = make_padded(desired_size, alignment);
cur_offset = cur_size;
cur_size += padded_size;
*(void**)((size_t)ret + member_offset) = (void*)((size_t)ret + cur_offset);
}
va_end(ap);
return ret;
}
void bunchfree(void* ptr)
{
free(ptr);
}