diff options
Diffstat (limited to 'third_party/base')
-rw-r--r-- | third_party/base/allocator/partition_allocator/partition_alloc.cc | 45 | ||||
-rw-r--r-- | third_party/base/allocator/partition_allocator/partition_alloc.h | 12 |
2 files changed, 42 insertions, 15 deletions
diff --git a/third_party/base/allocator/partition_allocator/partition_alloc.cc b/third_party/base/allocator/partition_allocator/partition_alloc.cc index ff366b861f..e8aad9420c 100644 --- a/third_party/base/allocator/partition_allocator/partition_alloc.cc +++ b/third_party/base/allocator/partition_allocator/partition_alloc.cc @@ -1021,22 +1021,29 @@ bool partitionReallocDirectMappedInPlace(PartitionRootGeneric* root, return true; } -void* PartitionReallocGeneric(PartitionRootGeneric* root, - void* ptr, - size_t new_size, - const char* type_name) { +void* PartitionReallocGenericFlags(PartitionRootGeneric* root, + int flags, + void* ptr, + size_t new_size, + const char* type_name) { #if defined(MEMORY_TOOL_REPLACES_ALLOCATOR) - return realloc(ptr, new_size); + void* result = realloc(ptr, new_size); + CHECK(result || flags & PartitionAllocReturnNull); + return result; #else if (UNLIKELY(!ptr)) - return PartitionAllocGeneric(root, new_size, type_name); + return PartitionAllocGenericFlags(root, flags, new_size, type_name); if (UNLIKELY(!new_size)) { PartitionFreeGeneric(root, ptr); - return 0; + return nullptr; } - if (new_size > kGenericMaxDirectMapped) - PartitionExcessiveAllocationSize(); + if (new_size > kGenericMaxDirectMapped) { + if (flags & PartitionAllocReturnNull) + return nullptr; + else + PartitionExcessiveAllocationSize(); + } DCHECK(PartitionPointerIsValid(PartitionCookieFreePointerAdjust(ptr))); @@ -1069,12 +1076,19 @@ void* PartitionReallocGeneric(PartitionRootGeneric* root, // |new_size| via the raw size pointer. if (PartitionPageGetRawSizePtr(page)) PartitionCookieWriteValue(static_cast<char*>(ptr) + new_size); -#endif +#endif // DCHECK_IS_ON() return ptr; } // This realloc cannot be resized in-place. Sadness. - void* ret = PartitionAllocGeneric(root, new_size, type_name); + void* ret = PartitionAllocGenericFlags(root, flags, new_size, type_name); + if (!ret) { + if (flags & PartitionAllocReturnNull) + return nullptr; + else + PartitionExcessiveAllocationSize(); + } + size_t copy_size = actual_old_size; if (new_size < copy_size) copy_size = new_size; @@ -1082,7 +1096,14 @@ void* PartitionReallocGeneric(PartitionRootGeneric* root, memcpy(ret, ptr, copy_size); PartitionFreeGeneric(root, ptr); return ret; -#endif +#endif // defined(MEMORY_TOOL_REPLACES_ALLOCATOR) +} + +void* PartitionReallocGeneric(PartitionRootGeneric* root, + void* ptr, + size_t new_size, + const char* type_name) { + return PartitionReallocGenericFlags(root, 0, ptr, new_size, type_name); } static size_t PartitionPurgePage(PartitionPage* page, bool discard) { diff --git a/third_party/base/allocator/partition_allocator/partition_alloc.h b/third_party/base/allocator/partition_allocator/partition_alloc.h index 87db329af2..69fba97d62 100644 --- a/third_party/base/allocator/partition_allocator/partition_alloc.h +++ b/third_party/base/allocator/partition_allocator/partition_alloc.h @@ -432,9 +432,15 @@ BASE_EXPORT NOINLINE void* PartitionAllocSlowPath(PartitionRootBase*, size_t, PartitionBucket*); BASE_EXPORT NOINLINE void PartitionFreeSlowPath(PartitionPage*); -BASE_EXPORT NOINLINE void* PartitionReallocGeneric(PartitionRootGeneric*, - void*, - size_t, +BASE_EXPORT NOINLINE void* PartitionReallocGenericFlags( + PartitionRootGeneric* root, + int flags, + void* ptr, + size_t new_size, + const char* type_name); +BASE_EXPORT NOINLINE void* PartitionReallocGeneric(PartitionRootGeneric* root, + void* ptr, + size_t new_size, const char* type_name); BASE_EXPORT void PartitionDumpStats(PartitionRoot*, |