19
19
#define MINIMUM_CHUNK_COUNT (128)
20
20
21
21
// alignment of the base allocator
22
- #define MEMORY_ALIGNMENT (8 )
22
+ #define MEMORY_ALIGNMENT (sizeof(uintptr_t) )
23
23
24
24
typedef struct umf_ba_chunk_t umf_ba_chunk_t ;
25
25
typedef struct umf_ba_next_pool_t umf_ba_next_pool_t ;
@@ -34,7 +34,7 @@ struct umf_ba_chunk_t {
34
34
struct umf_ba_main_pool_meta_t {
35
35
size_t pool_size ; // size of each pool (argument of each ba_os_alloc() call)
36
36
size_t chunk_size ; // size of all memory chunks in this pool
37
- os_mutex_t * free_lock ; // lock of free_list
37
+ os_mutex_t free_lock ; // lock of free_list
38
38
umf_ba_chunk_t * free_list ; // list of free chunks
39
39
#ifndef NDEBUG
40
40
size_t n_pools ;
@@ -146,29 +146,26 @@ umf_ba_pool_t *umf_ba_create(size_t size) {
146
146
147
147
align_ptr_size ((void * * )& data_ptr , & size_left , MEMORY_ALIGNMENT );
148
148
149
- // allocate and init free_lock
150
- pool -> metadata .free_lock = util_mutex_init ( data_ptr );
151
- if (!pool -> metadata . free_lock ) {
149
+ // init free_lock
150
+ os_mutex_t * mutex = util_mutex_init ( & pool -> metadata .free_lock );
151
+ if (!mutex ) {
152
152
ba_os_free (pool , pool_size );
153
153
return NULL ;
154
154
}
155
155
156
- data_ptr += mutex_size ; // free_lock is here
157
- size_left -= mutex_size ; // for free_lock
158
-
159
156
pool -> metadata .free_list = NULL ;
160
157
ba_divide_memory_into_chunks (pool , data_ptr , size_left );
161
158
162
159
return pool ;
163
160
}
164
161
165
162
void * umf_ba_alloc (umf_ba_pool_t * pool ) {
166
- util_mutex_lock (pool -> metadata .free_lock );
163
+ util_mutex_lock (& pool -> metadata .free_lock );
167
164
if (pool -> metadata .free_list == NULL ) {
168
165
umf_ba_next_pool_t * new_pool =
169
166
(umf_ba_next_pool_t * )ba_os_alloc (pool -> metadata .pool_size );
170
167
if (!new_pool ) {
171
- util_mutex_unlock (pool -> metadata .free_lock );
168
+ util_mutex_unlock (& pool -> metadata .free_lock );
172
169
return NULL ;
173
170
}
174
171
@@ -194,7 +191,7 @@ void *umf_ba_alloc(umf_ba_pool_t *pool) {
194
191
pool -> metadata .n_allocs ++ ;
195
192
ba_debug_checks (pool );
196
193
#endif /* NDEBUG */
197
- util_mutex_unlock (pool -> metadata .free_lock );
194
+ util_mutex_unlock (& pool -> metadata .free_lock );
198
195
199
196
return chunk ;
200
197
}
@@ -206,14 +203,14 @@ void umf_ba_free(umf_ba_pool_t *pool, void *ptr) {
206
203
207
204
umf_ba_chunk_t * chunk = (umf_ba_chunk_t * )ptr ;
208
205
209
- util_mutex_lock (pool -> metadata .free_lock );
206
+ util_mutex_lock (& pool -> metadata .free_lock );
210
207
chunk -> next = pool -> metadata .free_list ;
211
208
pool -> metadata .free_list = chunk ;
212
209
#ifndef NDEBUG
213
210
pool -> metadata .n_allocs -- ;
214
211
ba_debug_checks (pool );
215
212
#endif /* NDEBUG */
216
- util_mutex_unlock (pool -> metadata .free_lock );
213
+ util_mutex_unlock (& pool -> metadata .free_lock );
217
214
}
218
215
219
216
void umf_ba_destroy (umf_ba_pool_t * pool ) {
@@ -230,6 +227,6 @@ void umf_ba_destroy(umf_ba_pool_t *pool) {
230
227
ba_os_free (current_pool , size );
231
228
}
232
229
233
- util_mutex_destroy_not_free (pool -> metadata .free_lock );
230
+ util_mutex_destroy_not_free (& pool -> metadata .free_lock );
234
231
ba_os_free (pool , size );
235
232
}
0 commit comments