| Index: Source/wtf/PartitionAlloc.cpp
|
| diff --git a/Source/wtf/PartitionAlloc.cpp b/Source/wtf/PartitionAlloc.cpp
|
| index d14559485d97aa50051843fc2c46b32762e0f7f5..e43617ad53b0f9e2260b5c6d29ea74ec740e55f0 100644
|
| --- a/Source/wtf/PartitionAlloc.cpp
|
| +++ b/Source/wtf/PartitionAlloc.cpp
|
| @@ -31,6 +31,9 @@
|
| #include "config.h"
|
| #include "wtf/PartitionAlloc.h"
|
|
|
| +#include "wtf/Alias.h"
|
| +#include "wtf/Partitions.h"
|
| +
|
| #include <string.h>
|
|
|
| #ifndef NDEBUG
|
| @@ -59,6 +62,7 @@ int PartitionRootBase::gInitializedLock = 0;
|
| bool PartitionRootBase::gInitialized = false;
|
| PartitionPage PartitionRootBase::gSeedPage;
|
| PartitionBucket PartitionRootBase::gPagedBucket;
|
| +size_t (*PartitionRootBase::gMemoryUsageReportFunction)() = nullptr;
|
|
|
| static uint16_t partitionBucketNumSystemPages(size_t size)
|
| {
|
| @@ -138,6 +142,11 @@ static void partitionBucketInitBase(PartitionBucket* bucket, PartitionRootBase*
|
| bucket->numSystemPagesPerSlotSpan = partitionBucketNumSystemPages(bucket->slotSize);
|
| }
|
|
|
| +void partitionAllocGlobalInit(size_t (*memoryUsageReportFunc)())
|
| +{
|
| + PartitionRootBase::gMemoryUsageReportFunction = memoryUsageReportFunc;
|
| +}
|
| +
|
| void partitionAllocInit(PartitionRoot* root, size_t numBuckets, size_t maxAllocation)
|
| {
|
| partitionAllocBaseInit(root);
|
| @@ -299,7 +308,70 @@ static NEVER_INLINE void partitionOutOfMemoryWithLotsOfUncommitedPages()
|
| }
|
| #endif
|
|
|
| -static NEVER_INLINE void partitionOutOfMemory(const PartitionRootBase* root)
|
| +static NEVER_INLINE void partitionOutOfMemoryUsing2G()
|
| +{
|
| + const void* signature = (void*)&partitionOutOfMemoryUsing2G;
|
| + alias(signature);
|
| + IMMEDIATE_CRASH();
|
| +}
|
| +
|
| +static NEVER_INLINE void partitionOutOfMemoryUsing1G()
|
| +{
|
| + const void* signature = (void*)&partitionOutOfMemoryUsing1G;
|
| + alias(signature);
|
| + IMMEDIATE_CRASH();
|
| +}
|
| +
|
| +static NEVER_INLINE void partitionOutOfMemoryUsing512M()
|
| +{
|
| + const void* signature = (void*)&partitionOutOfMemoryUsing512M;
|
| + alias(signature);
|
| + IMMEDIATE_CRASH();
|
| +}
|
| +
|
| +static NEVER_INLINE void partitionOutOfMemoryUsing256M()
|
| +{
|
| + const void* signature = (void*)&partitionOutOfMemoryUsing256M;
|
| + alias(signature);
|
| + IMMEDIATE_CRASH();
|
| +}
|
| +
|
| +static NEVER_INLINE void partitionOutOfMemoryUsing128M()
|
| +{
|
| + const void* signature = (void*)&partitionOutOfMemoryUsing128M;
|
| + alias(signature);
|
| + IMMEDIATE_CRASH();
|
| +}
|
| +
|
| +static NEVER_INLINE void partitionOutOfMemoryUsing64M()
|
| +{
|
| + const void* signature = (void*)&partitionOutOfMemoryUsing64M;
|
| + alias(signature);
|
| + IMMEDIATE_CRASH();
|
| +}
|
| +
|
| +static NEVER_INLINE void partitionOutOfMemoryUsing32M()
|
| +{
|
| + const void* signature = (void*)&partitionOutOfMemoryUsing32M;
|
| + alias(signature);
|
| + IMMEDIATE_CRASH();
|
| +}
|
| +
|
| +static NEVER_INLINE void partitionOutOfMemoryUsing16M()
|
| +{
|
| + const void* signature = (void*)&partitionOutOfMemoryUsing16M;
|
| + alias(signature);
|
| + IMMEDIATE_CRASH();
|
| +}
|
| +
|
| +static NEVER_INLINE void partitionOutOfMemoryUsingLessThan16M()
|
| +{
|
| + const void* signature = (void*)&partitionOutOfMemoryUsingLessThan16M;
|
| + alias(signature);
|
| + IMMEDIATE_CRASH();
|
| +}
|
| +
|
| +static void partitionOutOfMemory(const PartitionRootBase* root)
|
| {
|
| #if !CPU(64BIT)
|
| // Check whether this OOM is due to a lot of super pages that are allocated
|
| @@ -308,7 +380,24 @@ static NEVER_INLINE void partitionOutOfMemory(const PartitionRootBase* root)
|
| partitionOutOfMemoryWithLotsOfUncommitedPages();
|
| }
|
| #endif
|
| - IMMEDIATE_CRASH();
|
| + volatile size_t totalUsage = (*PartitionRootBase::gMemoryUsageReportFunction)();
|
| + if (totalUsage >= 2UL * 1024 * 1024 * 1024)
|
| + partitionOutOfMemoryUsing2G();
|
| + if (totalUsage >= 1UL * 1024 * 1024 * 1024)
|
| + partitionOutOfMemoryUsing1G();
|
| + if (totalUsage >= 512 * 1024 * 1024)
|
| + partitionOutOfMemoryUsing512M();
|
| + if (totalUsage >= 256 * 1024 * 1024)
|
| + partitionOutOfMemoryUsing256M();
|
| + if (totalUsage >= 128 * 1024 * 1024)
|
| + partitionOutOfMemoryUsing128M();
|
| + if (totalUsage >= 64 * 1024 * 1024)
|
| + partitionOutOfMemoryUsing64M();
|
| + if (totalUsage >= 32 * 1024 * 1024)
|
| + partitionOutOfMemoryUsing32M();
|
| + if (totalUsage >= 16 * 1024 * 1024)
|
| + partitionOutOfMemoryUsing16M();
|
| + partitionOutOfMemoryUsingLessThan16M();
|
| }
|
|
|
| static NEVER_INLINE void partitionExcessiveAllocationSize()
|
|
|