Skip to content

Commit a046b6f

Browse files
authored
Merge pull request #975 from jblazquez/free-segment-map
Free segment map when destroy_on_exit is set
2 parents 7bd1d72 + 83dacd1 commit a046b6f

File tree

3 files changed

+12
-0
lines changed

3 files changed

+12
-0
lines changed

include/mimalloc/internal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ void _mi_arena_field_cursor_done(mi_arena_field_cursor_t* current);
167167
// "segment-map.c"
168168
void _mi_segment_map_allocated_at(const mi_segment_t* segment);
169169
void _mi_segment_map_freed_at(const mi_segment_t* segment);
170+
void _mi_segment_map_destroy(void);
170171

171172
// "segment.c"
172173
mi_page_t* _mi_segment_page_alloc(mi_heap_t* heap, size_t block_size, size_t page_alignment, mi_segments_tld_t* tld);

src/init.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,7 @@ void mi_cdecl _mi_process_done(void) {
682682
mi_collect(true /* force */);
683683
_mi_heap_unsafe_destroy_all(); // forcefully release all memory held by all heaps (of this thread only!)
684684
_mi_arena_unsafe_destroy_all();
685+
_mi_segment_map_destroy();
685686
}
686687

687688
if (mi_option_is_enabled(mi_option_show_stats) || mi_option_is_enabled(mi_option_verbose)) {

src/segment-map.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ static mi_segmap_part_t* mi_segment_map_index_of(const mi_segment_t* segment, bo
5757
mi_memid_t memid;
5858
part = (mi_segmap_part_t*)_mi_os_alloc(sizeof(mi_segmap_part_t), &memid);
5959
if (part == NULL) return NULL;
60+
part->memid = memid;
6061
mi_segmap_part_t* expected = NULL;
6162
if (!mi_atomic_cas_ptr_strong_release(mi_segmap_part_t, &mi_segment_map[segindex], &expected, part)) {
6263
_mi_os_free(part, sizeof(mi_segmap_part_t), memid);
@@ -124,3 +125,12 @@ static bool mi_is_valid_pointer(const void* p) {
124125
mi_decl_nodiscard mi_decl_export bool mi_is_in_heap_region(const void* p) mi_attr_noexcept {
125126
return mi_is_valid_pointer(p);
126127
}
128+
129+
void _mi_segment_map_destroy(void) {
130+
for (size_t i = 0; i < MI_SEGMENT_MAP_MAX_PARTS; i++) {
131+
mi_segmap_part_t* part = mi_segment_map[i];
132+
if (part != NULL) {
133+
_mi_os_free(part, sizeof(mi_segmap_part_t), part->memid);
134+
}
135+
}
136+
}

0 commit comments

Comments
 (0)