MCPcopy Create free account
hub / github.com/OpenStarbound/OpenStarbound / _rpmalloc_heap_finalize

Function _rpmalloc_heap_finalize

source/extern/rpmalloc.c:2077–2126  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2075}
2076
2077static 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////////////

Callers 1

Tested by

no test coverage detected