| 2075 | } |
| 2076 | |
| 2077 | static void |
| 2078 | _rpmalloc_heap_finalize(heap_t* heap) { |
| 2079 | if (heap->spans_reserved) { |
| 2080 | span_t* span = _rpmalloc_span_map(heap, heap->spans_reserved); |
| 2081 | _rpmalloc_span_unmap(span); |
| 2082 | heap->spans_reserved = 0; |
| 2083 | } |
| 2084 | |
| 2085 | _rpmalloc_heap_cache_adopt_deferred(heap, 0); |
| 2086 | |
| 2087 | for (size_t iclass = 0; iclass < SIZE_CLASS_COUNT; ++iclass) { |
| 2088 | if (heap->size_class[iclass].cache) |
| 2089 | _rpmalloc_span_unmap(heap->size_class[iclass].cache); |
| 2090 | heap->size_class[iclass].cache = 0; |
| 2091 | span_t* span = heap->size_class[iclass].partial_span; |
| 2092 | while (span) { |
| 2093 | span_t* next = span->next; |
| 2094 | _rpmalloc_span_finalize(heap, iclass, span, &heap->size_class[iclass].partial_span); |
| 2095 | span = next; |
| 2096 | } |
| 2097 | // If class still has a free list it must be a full span |
| 2098 | if (heap->size_class[iclass].free_list) { |
| 2099 | span_t* class_span = (span_t*)((uintptr_t)heap->size_class[iclass].free_list & _memory_span_mask); |
| 2100 | span_t** list = 0; |
| 2101 | #if RPMALLOC_FIRST_CLASS_HEAPS |
| 2102 | list = &heap->full_span[iclass]; |
| 2103 | #endif |
| 2104 | --heap->full_span_count; |
| 2105 | if (!_rpmalloc_span_finalize(heap, iclass, class_span, list)) { |
| 2106 | if (list) |
| 2107 | _rpmalloc_span_double_link_list_remove(list, class_span); |
| 2108 | _rpmalloc_span_double_link_list_add(&heap->size_class[iclass].partial_span, class_span); |
| 2109 | } |
| 2110 | } |
| 2111 | } |
| 2112 | |
| 2113 | #if ENABLE_THREAD_CACHE |
| 2114 | for (size_t iclass = 0; iclass < LARGE_CLASS_COUNT; ++iclass) { |
| 2115 | span_cache_t* span_cache; |
| 2116 | if (!iclass) |
| 2117 | span_cache = &heap->span_cache; |
| 2118 | else |
| 2119 | span_cache = (span_cache_t*)(heap->span_large_cache + (iclass - 1)); |
| 2120 | for (size_t ispan = 0; ispan < span_cache->count; ++ispan) |
| 2121 | _rpmalloc_span_unmap(span_cache->span[ispan]); |
| 2122 | span_cache->count = 0; |
| 2123 | } |
| 2124 | #endif |
| 2125 | rpmalloc_assert(!atomic_load_ptr(&heap->span_free_deferred), "Heaps still active during finalization"); |
| 2126 | } |
| 2127 | |
| 2128 | |
| 2129 | //////////// |
no test coverage detected