Range& Heap::findXLarge(std::unique_lock<StaticMutex>&, void* object) { for (auto& range : m_xLargeObjects) { if (range.begin() != object) continue; return range; } RELEASE_BASSERT(false); return *static_cast<Range*>(nullptr); // Silence compiler error. }
void* Allocator::reallocate(void* object, size_t newSize) { if (!m_isBmallocEnabled) return realloc(object, newSize); void* result = allocate(newSize); if (!object) return result; size_t oldSize = 0; switch (objectType(object)) { case Small: { SmallPage* page = SmallPage::get(SmallLine::get(object)); oldSize = objectSize(page->sizeClass()); break; } case Medium: { MediumPage* page = MediumPage::get(MediumLine::get(object)); oldSize = objectSize(page->sizeClass()); break; } case Large: { std::lock_guard<StaticMutex> lock(PerProcess<Heap>::mutex()); LargeObject largeObject(object); oldSize = largeObject.size(); break; } case XLarge: { std::lock_guard<StaticMutex> lock(PerProcess<Heap>::mutex()); Range range = PerProcess<Heap>::getFastCase()->findXLarge(lock, object); RELEASE_BASSERT(range); oldSize = range.size(); break; } } size_t copySize = std::min(oldSize, newSize); memcpy(result, object, copySize); m_deallocator.deallocate(object); return result; }
void* Heap::allocateXLarge(std::lock_guard<StaticMutex>& lock, size_t alignment, size_t size) { void* result = tryAllocateXLarge(lock, alignment, size); RELEASE_BASSERT(result); return result; }