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

Function _rpmalloc_span_map

source/extern/rpmalloc.c:1221–1251  ·  view source on GitHub ↗

Map in memory pages for the given number of spans (or use previously reserved pages)

Source from the content-addressed store, hash-verified

1219
1220//! Map in memory pages for the given number of spans (or use previously reserved pages)
1221static span_t*
1222_rpmalloc_span_map(heap_t* heap, size_t span_count) {
1223 if (span_count <= heap->spans_reserved)
1224 return _rpmalloc_span_map_from_reserve(heap, span_count);
1225 span_t* span = 0;
1226 int use_global_reserve = (_memory_page_size > _memory_span_size) || (_memory_span_map_count > _memory_heap_reserve_count);
1227 if (use_global_reserve) {
1228 // If huge pages, make sure only one thread maps more memory to avoid bloat
1229 while (!atomic_cas32_acquire(&_memory_global_lock, 1, 0))
1230 _rpmalloc_spin();
1231 if (_memory_global_reserve_count >= span_count) {
1232 size_t reserve_count = (!heap->spans_reserved ? _memory_heap_reserve_count : span_count);
1233 if (_memory_global_reserve_count < reserve_count)
1234 reserve_count = _memory_global_reserve_count;
1235 span = _rpmalloc_global_get_reserved_spans(reserve_count);
1236 if (span) {
1237 if (reserve_count > span_count) {
1238 span_t* reserved_span = (span_t*)pointer_offset(span, span_count << _memory_span_size_shift);
1239 _rpmalloc_heap_set_reserved_spans(heap, _memory_global_reserve_master, reserved_span, reserve_count - span_count);
1240 }
1241 // Already marked as subspan in _rpmalloc_global_get_reserved_spans
1242 span->span_count = (uint32_t)span_count;
1243 }
1244 }
1245 }
1246 if (!span)
1247 span = _rpmalloc_span_map_aligned_count(heap, span_count);
1248 if (use_global_reserve)
1249 atomic_store32_release(&_memory_global_lock, 0);
1250 return span;
1251}
1252
1253//! Unmap memory pages for the given number of spans (or mark as unused if no partial unmappings)
1254static void

Callers 3

_rpmalloc_heap_finalizeFunction · 0.85

Tested by

no test coverage detected