void HeapImpl::MapFree(void* ptr) { MapAllocation** allocation = &map_allocation_list_; while (*allocation && (*allocation)->ptr != ptr) allocation = &(*allocation)->next; assert(*allocation != nullptr); munmap((*allocation)->ptr, (*allocation)->size); FreeLocked(*allocation); *allocation = (*allocation)->next; }
void* HeapImpl::MapAlloc(size_t size) { size = (size + kPageSize - 1) & ~(kPageSize - 1); MapAllocation* allocation = reinterpret_cast<MapAllocation*>(AllocLocked(sizeof(MapAllocation))); void* ptr = MapAligned(size, kChunkSize); if (!ptr) { FreeLocked(allocation); abort(); // throw std::bad_alloc; } allocation->ptr = ptr; allocation->size = size; allocation->next = map_allocation_list_; map_allocation_list_ = allocation; return ptr; }
void HeapImpl::Free(void *ptr) { std::lock_guard<std::mutex> lk(m_); FreeLocked(ptr); }