Insert a single span into thread heap cache, releasing to global cache if overflow
| 1695 | |
| 1696 | //! Insert a single span into thread heap cache, releasing to global cache if overflow |
| 1697 | static 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 |
| 1749 | static span_t* |
no test coverage detected