Arax -8d09c51940345c86062e8ef2427c705ae66e5926
A Runtime Framework for Decoupling Applications from Heterogeneous Accelerators
Loading...
Searching...
No Matches
dlmalloc/alloc.c
Go to the documentation of this file.
1#include "arch/alloc.h"
2#include "utils/timer.h"
3#include <string.h>
4#define MALLOC_INSPECT_ALL 1
5#include <malloc.h>
6#define ONLY_MSPACES 1
7#define USE_SPIN_LOCKS 1
8#define MSPACES 1
9#define HAVE_MMAP 1
10#include "malloc.h"
11
19
20#define BIT_ALLOCATOR_BLOCK (4096ul)
21#define BIT_ALLOCATOR_BLOCK_MASK (BIT_ALLOCATOR_BLOCK - 1)
22#define BITS_PER_PAGE (BIT_ALLOCATOR_BLOCK * 8ul)
23
24
26
27int arch_alloc_init_once(arch_alloc_s *_alloc, size_t size)
28{
29 struct arch_alloc_inner_s *alloc = (struct arch_alloc_inner_s *) _alloc;
30
31 void *usable_area = alloc + 1;
32
33 void *alligned_start =
34 (void *) ((((size_t) usable_area) + (BIT_ALLOCATOR_BLOCK_MASK)) & (~BIT_ALLOCATOR_BLOCK_MASK));
35
36 size_t alligned_size = size - (((size_t) alligned_start) - ((size_t) _alloc));
37
38 size_t alligned_pages = alligned_size / BIT_ALLOCATOR_BLOCK;
39
40 size_t bitmap_pages = (alligned_pages + (BITS_PER_PAGE - 1)) / BITS_PER_PAGE;
41
42 alligned_start += BIT_ALLOCATOR_BLOCK * bitmap_pages;
43
44 alligned_pages -= bitmap_pages;
45
46 utils_bitmap_init(&(alloc->bmp), alligned_pages);
47
48 alloc->start = alligned_start;
49
50 global_alloc = alloc;
51
52 alloc->root = create_mspace(0, 1);
53
54 return 0;
55}
56
58{
59 global_alloc = (struct arch_alloc_inner_s *) alloc;
60}
61
62void* arch_alloc_allocate(arch_alloc_s *_alloc, size_t size)
63{
64 struct arch_alloc_inner_s *alloc = (struct arch_alloc_inner_s *) _alloc;
65 void *data;
66
67 #ifdef ALLOC_STATS
70 #endif
71
72 data = mspace_malloc(alloc->root, size);
73
74 #ifdef ALLOC_STATS
75 utils_timer_set(dt, stop);
76 __sync_fetch_and_add(&(_alloc->alloc_ns[!!data]),
78 __sync_fetch_and_add(&(_alloc->allocs[!!data]), 1);
79 #endif
80 return data;
81}
82
83void _arch_alloc_free(arch_alloc_s *_alloc, void *mem)
84{
85 struct arch_alloc_inner_s *alloc = (struct arch_alloc_inner_s *) _alloc;
86
87 #ifdef ALLOC_STATS
90 #endif
91
92 mspace_free(alloc->root, mem);
93
94 #ifdef ALLOC_STATS
95 utils_timer_set(dt, stop);
96 __sync_fetch_and_add(&(_alloc->free_ns),
98 __sync_fetch_and_add(&(_alloc->frees), 1);
99 #endif
100}
101
103{
104 struct arch_alloc_inner_s *alloc = (struct arch_alloc_inner_s *) _alloc;
105
106 destroy_mspace(alloc->root);
107}
108
109static void _arch_alloc_mspace_mallinfo(mspace *mspace, arch_alloc_stats_s *stats)
110{
111 struct mallinfo minfo = mspace_mallinfo(mspace);
112
113 stats->total_bytes += (unsigned int) minfo.arena;
114 stats->used_bytes += (unsigned int) minfo.uordblks;
115}
116
118{
119 struct arch_alloc_inner_s *alloc = (struct arch_alloc_inner_s *) _alloc;
120 arch_alloc_stats_s stats = { 0 };
121
122 _arch_alloc_mspace_mallinfo(alloc->root, &stats);
123
124 #ifdef ALLOC_STATS
125 stats.allocs[0] = _alloc->allocs[0];
126 stats.allocs[1] = _alloc->allocs[1];
127 stats.frees = _alloc->frees;
128 stats.alloc_ns[0] = _alloc->alloc_ns[0];
129 stats.alloc_ns[1] = _alloc->alloc_ns[1];
130 stats.free_ns = _alloc->free_ns;
131 #endif
132 return stats;
133}
134
135void arch_alloc_inspect(arch_alloc_s *_alloc, void (*inspector)(void *start, void *end, size_t size,
136 void *arg), void *arg)
137{
138 struct arch_alloc_inner_s *alloc = (struct arch_alloc_inner_s *) _alloc;
139
140 mspace_inspect_all(alloc->root, inspector, arg);
141}
142
143void* arax_mmap(size_t s)
144{
147 size_t off = utils_bitmap_alloc_bits(&(global_alloc->bmp), s);
148
150 off *= BIT_ALLOCATOR_BLOCK;
151 return global_alloc->start + off;
152}
153
154void* arax_ummap(void *a, size_t s)
155{
156 size_t start = (a - (global_alloc->start)) / BIT_ALLOCATOR_BLOCK;
157 size_t size_blocks = s / BIT_ALLOCATOR_BLOCK;
158
159 utils_bitmap_free_bits(&(global_alloc->bmp), start, size_blocks);
160 return 0;
161}
162
164{
165 struct arch_alloc_inner_s *alloc = arch_alloc_allocate(parent, sizeof(*alloc));
166
167 alloc->root = create_mspace(0, 1);
168
169 return (arch_alloc_s *) alloc;
170}
171
173{
174 return &(global_alloc->bmp);
175}
#define arax_assert(EXPR)
Definition arax_assert.h:7
struct utils_bitmap utils_bitmap_s
#define BITMAP_NOT_FOUND
Definition bitmap.h:18
#define utils_timer_get_duration_ns(NAME)
Definition timer.h:82
#define utils_timer_set(NAME, WHAT)
Definition timer.h:13
size_t utils_bitmap_alloc_bits(utils_bitmap_s *bmp, size_t bits)
Definition bitmap.c:217
utils_bitmap_s * utils_bitmap_init(void *mem, size_t size_bits)
Definition bitmap.c:25
void utils_bitmap_free_bits(utils_bitmap_s *bmp, size_t start, size_t bits)
Definition bitmap.c:255
size_t total_bytes
Definition alloc.h:85
size_t used_bytes
Definition alloc.h:86
utils_bitmap_s bmp
MALLINFO_FIELD_TYPE arena
Definition malloc.c:772
MALLINFO_FIELD_TYPE uordblks
Definition malloc.c:779
void * arax_ummap(void *a, size_t s)
arch_alloc_s * arch_alloc_create_sub_alloc(arch_alloc_s *parent)
#define BIT_ALLOCATOR_BLOCK_MASK
int arch_alloc_init_once(arch_alloc_s *_alloc, size_t size)
utils_bitmap_s * arch_alloc_get_bitmap()
#define BITS_PER_PAGE
void * arax_mmap(size_t s)
arch_alloc_stats_s arch_alloc_stats(arch_alloc_s *_alloc)
void arch_alloc_inspect(arch_alloc_s *_alloc, void(*inspector)(void *start, void *end, size_t size, void *arg), void *arg)
static void _arch_alloc_mspace_mallinfo(mspace *mspace, arch_alloc_stats_s *stats)
void arch_alloc_exit(arch_alloc_s *_alloc)
void arch_alloc_init_always(arch_alloc_s *alloc)
#define BIT_ALLOCATOR_BLOCK
void * arch_alloc_allocate(arch_alloc_s *_alloc, size_t size)
static struct arch_alloc_inner_s * global_alloc
void _arch_alloc_free(arch_alloc_s *_alloc, void *mem)