Map in memory pages for the given number of spans (or use previously reserved pages)
| 1219 | |
| 1220 | //! Map in memory pages for the given number of spans (or use previously reserved pages) |
| 1221 | static 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) |
| 1254 | static void |
no test coverage detected