@@ -168,22 +168,23 @@ bool _mi_os_secure_guard_page_reset_before(void* addr, mi_memid_t memid) {
168
168
Free memory
169
169
-------------------------------------------------------------- */
170
170
171
- static void mi_os_free_huge_os_pages (void * p , size_t size );
171
+ static void mi_os_free_huge_os_pages (void * p , size_t size , mi_subproc_t * subproc );
172
172
173
- static void mi_os_prim_free (void * addr , size_t size , size_t commit_size ) {
173
+ static void mi_os_prim_free (void * addr , size_t size , size_t commit_size , mi_subproc_t * subproc ) {
174
174
mi_assert_internal ((size % _mi_os_page_size ()) == 0 );
175
175
if (addr == NULL ) return ; // || _mi_os_is_huge_reserved(addr)
176
176
int err = _mi_prim_free (addr , size ); // allow size==0 (issue #1041)
177
177
if (err != 0 ) {
178
178
_mi_warning_message ("unable to free OS memory (error: %d (0x%x), size: 0x%zx bytes, address: %p)\n" , err , err , size , addr );
179
179
}
180
+ if (subproc == NULL ) { subproc = _mi_subproc (); } // from `mi_arenas_unsafe_destroy` we pass subproc_main explicitly as we can no longer use the heap pointer
180
181
if (commit_size > 0 ) {
181
- mi_os_stat_decrease ( committed , commit_size );
182
+ mi_subproc_stat_decrease ( subproc , committed , commit_size );
182
183
}
183
- mi_os_stat_decrease ( reserved , size );
184
+ mi_subproc_stat_decrease ( subproc , reserved , size );
184
185
}
185
186
186
- void _mi_os_free_ex (void * addr , size_t size , bool still_committed , mi_memid_t memid ) {
187
+ void _mi_os_free_ex (void * addr , size_t size , bool still_committed , mi_memid_t memid , mi_subproc_t * subproc /* can be NULL */ ) {
187
188
if (mi_memkind_is_os (memid .memkind )) {
188
189
size_t csize = memid .mem .os .size ;
189
190
if (csize == 0 ) { csize = _mi_os_good_alloc_size (size ); }
@@ -204,10 +205,10 @@ void _mi_os_free_ex(void* addr, size_t size, bool still_committed, mi_memid_t me
204
205
// free it
205
206
if (memid .memkind == MI_MEM_OS_HUGE ) {
206
207
mi_assert (memid .is_pinned );
207
- mi_os_free_huge_os_pages (base , csize );
208
+ mi_os_free_huge_os_pages (base , csize , subproc );
208
209
}
209
210
else {
210
- mi_os_prim_free (base , csize , (still_committed ? commit_size : 0 ));
211
+ mi_os_prim_free (base , csize , (still_committed ? commit_size : 0 ), subproc );
211
212
}
212
213
}
213
214
else {
@@ -217,7 +218,7 @@ void _mi_os_free_ex(void* addr, size_t size, bool still_committed, mi_memid_t me
217
218
}
218
219
219
220
void _mi_os_free (void * p , size_t size , mi_memid_t memid ) {
220
- _mi_os_free_ex (p , size , true, memid );
221
+ _mi_os_free_ex (p , size , true, memid , NULL );
221
222
}
222
223
223
224
@@ -292,7 +293,7 @@ static void* mi_os_prim_alloc_aligned(size_t size, size_t alignment, bool commit
292
293
_mi_warning_message ("unable to allocate aligned OS memory directly, fall back to over-allocation (size: 0x%zx bytes, address: %p, alignment: 0x%zx, commit: %d)\n" , size , p , alignment , commit );
293
294
}
294
295
#endif
295
- if (p != NULL ) { mi_os_prim_free (p , size , (commit ? size : 0 )); }
296
+ if (p != NULL ) { mi_os_prim_free (p , size , (commit ? size : 0 ), NULL ); }
296
297
if (size >= (SIZE_MAX - alignment )) return NULL ; // overflow
297
298
const size_t over_size = size + alignment ;
298
299
@@ -310,7 +311,7 @@ static void* mi_os_prim_alloc_aligned(size_t size, size_t alignment, bool commit
310
311
// explicitly commit only the aligned part
311
312
if (commit ) {
312
313
if (!_mi_os_commit (p , size , NULL )) {
313
- mi_os_prim_free (* base , over_size , 0 );
314
+ mi_os_prim_free (* base , over_size , 0 , NULL );
314
315
return NULL ;
315
316
}
316
317
}
@@ -326,8 +327,8 @@ static void* mi_os_prim_alloc_aligned(size_t size, size_t alignment, bool commit
326
327
size_t mid_size = _mi_align_up (size , _mi_os_page_size ());
327
328
size_t post_size = over_size - pre_size - mid_size ;
328
329
mi_assert_internal (pre_size < over_size && post_size < over_size && mid_size >= size );
329
- if (pre_size > 0 ) { mi_os_prim_free (p , pre_size , (commit ? pre_size : 0 )); }
330
- if (post_size > 0 ) { mi_os_prim_free ((uint8_t * )aligned_p + mid_size , post_size , (commit ? post_size : 0 )); }
330
+ if (pre_size > 0 ) { mi_os_prim_free (p , pre_size , (commit ? pre_size : 0 ), NULL ); }
331
+ if (post_size > 0 ) { mi_os_prim_free ((uint8_t * )aligned_p + mid_size , post_size , (commit ? post_size : 0 ), NULL ); }
331
332
// we can return the aligned pointer on `mmap` systems
332
333
p = aligned_p ;
333
334
* base = aligned_p ; // since we freed the pre part, `*base == p`.
@@ -668,7 +669,7 @@ void* _mi_os_alloc_huge_os_pages(size_t pages, int numa_node, mi_msecs_t max_mse
668
669
// no success, issue a warning and break
669
670
if (p != NULL ) {
670
671
_mi_warning_message ("could not allocate contiguous huge OS page %zu at %p\n" , page , addr );
671
- mi_os_prim_free (p , MI_HUGE_OS_PAGE_SIZE , MI_HUGE_OS_PAGE_SIZE );
672
+ mi_os_prim_free (p , MI_HUGE_OS_PAGE_SIZE , MI_HUGE_OS_PAGE_SIZE , NULL );
672
673
}
673
674
break ;
674
675
}
@@ -710,11 +711,11 @@ void* _mi_os_alloc_huge_os_pages(size_t pages, int numa_node, mi_msecs_t max_mse
710
711
711
712
// free every huge page in a range individually (as we allocated per page)
712
713
// note: needed with VirtualAlloc but could potentially be done in one go on mmap'd systems.
713
- static void mi_os_free_huge_os_pages (void * p , size_t size ) {
714
+ static void mi_os_free_huge_os_pages (void * p , size_t size , mi_subproc_t * subproc ) {
714
715
if (p == NULL || size == 0 ) return ;
715
716
uint8_t * base = (uint8_t * )p ;
716
717
while (size >= MI_HUGE_OS_PAGE_SIZE ) {
717
- mi_os_prim_free (base , MI_HUGE_OS_PAGE_SIZE , MI_HUGE_OS_PAGE_SIZE );
718
+ mi_os_prim_free (base , MI_HUGE_OS_PAGE_SIZE , MI_HUGE_OS_PAGE_SIZE , subproc );
718
719
size -= MI_HUGE_OS_PAGE_SIZE ;
719
720
base += MI_HUGE_OS_PAGE_SIZE ;
720
721
}
0 commit comments