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

Function _rpmalloc_heap_cache_insert

source/extern/rpmalloc.c:1697–1746  ·  view source on GitHub ↗

Insert a single span into thread heap cache, releasing to global cache if overflow

Source from the content-addressed store, hash-verified

1695
1696//! Insert a single span into thread heap cache, releasing to global cache if overflow
1697static void
1698_rpmalloc_heap_cache_insert(heap_t* heap, span_t* span) {
1699 if (UNEXPECTED(heap->finalize != 0)) {
1700 _rpmalloc_span_unmap(span);
1701 _rpmalloc_heap_global_finalize(heap);
1702 return;
1703 }
1704#if ENABLE_THREAD_CACHE
1705 size_t span_count = span->span_count;
1706 _rpmalloc_stat_inc(&heap->span_use[span_count - 1].spans_to_cache);
1707 if (span_count == 1) {
1708 span_cache_t* span_cache = &heap->span_cache;
1709 span_cache->span[span_cache->count++] = span;
1710 if (span_cache->count == MAX_THREAD_SPAN_CACHE) {
1711 const size_t remain_count = MAX_THREAD_SPAN_CACHE - THREAD_SPAN_CACHE_TRANSFER;
1712#if ENABLE_GLOBAL_CACHE
1713 _rpmalloc_stat_add64(&heap->thread_to_global, THREAD_SPAN_CACHE_TRANSFER * _memory_span_size);
1714 _rpmalloc_stat_add(&heap->span_use[span_count - 1].spans_to_global, THREAD_SPAN_CACHE_TRANSFER);
1715 _rpmalloc_global_cache_insert_spans(span_cache->span + remain_count, span_count, THREAD_SPAN_CACHE_TRANSFER);
1716#else
1717 for (size_t ispan = 0; ispan < THREAD_SPAN_CACHE_TRANSFER; ++ispan)
1718 _rpmalloc_span_unmap(span_cache->span[remain_count + ispan]);
1719#endif
1720 span_cache->count = remain_count;
1721 }
1722 } else {
1723 size_t cache_idx = span_count - 2;
1724 span_large_cache_t* span_cache = heap->span_large_cache + cache_idx;
1725 span_cache->span[span_cache->count++] = span;
1726 const size_t cache_limit = (MAX_THREAD_SPAN_LARGE_CACHE - (span_count >> 1));
1727 if (span_cache->count == cache_limit) {
1728 const size_t transfer_limit = 2 + (cache_limit >> 2);
1729 const size_t transfer_count = (THREAD_SPAN_LARGE_CACHE_TRANSFER <= transfer_limit ? THREAD_SPAN_LARGE_CACHE_TRANSFER : transfer_limit);
1730 const size_t remain_count = cache_limit - transfer_count;
1731#if ENABLE_GLOBAL_CACHE
1732 _rpmalloc_stat_add64(&heap->thread_to_global, transfer_count * span_count * _memory_span_size);
1733 _rpmalloc_stat_add(&heap->span_use[span_count - 1].spans_to_global, transfer_count);
1734 _rpmalloc_global_cache_insert_spans(span_cache->span + remain_count, span_count, transfer_count);
1735#else
1736 for (size_t ispan = 0; ispan < transfer_count; ++ispan)
1737 _rpmalloc_span_unmap(span_cache->span[remain_count + ispan]);
1738#endif
1739 span_cache->count = remain_count;
1740 }
1741 }
1742#else
1743 (void)sizeof(heap);
1744 _rpmalloc_span_unmap(span);
1745#endif
1746}
1747
1748//! Extract the given number of spans from the different cache levels
1749static span_t*

Calls 2

_rpmalloc_span_unmapFunction · 0.85

Tested by

no test coverage detected