| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 // Check that some of our zanier calculations worked out as expected. | 52 // Check that some of our zanier calculations worked out as expected. |
| 53 static_assert(WTF::kGenericSmallestBucket == 8, "generic smallest bucket"); | 53 static_assert(WTF::kGenericSmallestBucket == 8, "generic smallest bucket"); |
| 54 static_assert(WTF::kGenericMaxBucketed == 983040, "generic max bucketed"); | 54 static_assert(WTF::kGenericMaxBucketed == 983040, "generic max bucketed"); |
| 55 | 55 |
| 56 namespace WTF { | 56 namespace WTF { |
| 57 | 57 |
| 58 int PartitionRootBase::gInitializedLock = 0; | 58 int PartitionRootBase::gInitializedLock = 0; |
| 59 bool PartitionRootBase::gInitialized = false; | 59 bool PartitionRootBase::gInitialized = false; |
| 60 PartitionPage PartitionRootBase::gSeedPage; | 60 PartitionPage PartitionRootBase::gSeedPage; |
| 61 PartitionBucket PartitionRootBase::gPagedBucket; | 61 PartitionBucket PartitionRootBase::gPagedBucket; |
| 62 void (*PartitionRootBase::gOomHandlingFunction)() = nullptr; |
| 62 | 63 |
| 63 static uint16_t partitionBucketNumSystemPages(size_t size) | 64 static uint16_t partitionBucketNumSystemPages(size_t size) |
| 64 { | 65 { |
| 65 // This works out reasonably for the current bucket sizes of the generic | 66 // This works out reasonably for the current bucket sizes of the generic |
| 66 // allocator, and the current values of partition page size and constants. | 67 // allocator, and the current values of partition page size and constants. |
| 67 // Specifically, we have enough room to always pack the slots perfectly into | 68 // Specifically, we have enough room to always pack the slots perfectly into |
| 68 // some number of system pages. The only waste is the waste associated with | 69 // some number of system pages. The only waste is the waste associated with |
| 69 // unfaulted pages (i.e. wasted address space). | 70 // unfaulted pages (i.e. wasted address space). |
| 70 // TODO: we end up using a lot of system pages for very small sizes. For | 71 // TODO: we end up using a lot of system pages for very small sizes. For |
| 71 // example, we'll use 12 system pages for slot size 24. The slot size is | 72 // example, we'll use 12 system pages for slot size 24. The slot size is |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 131 | 132 |
| 132 static void partitionBucketInitBase(PartitionBucket* bucket, PartitionRootBase*
root) | 133 static void partitionBucketInitBase(PartitionBucket* bucket, PartitionRootBase*
root) |
| 133 { | 134 { |
| 134 bucket->activePagesHead = &PartitionRootGeneric::gSeedPage; | 135 bucket->activePagesHead = &PartitionRootGeneric::gSeedPage; |
| 135 bucket->emptyPagesHead = 0; | 136 bucket->emptyPagesHead = 0; |
| 136 bucket->decommittedPagesHead = 0; | 137 bucket->decommittedPagesHead = 0; |
| 137 bucket->numFullPages = 0; | 138 bucket->numFullPages = 0; |
| 138 bucket->numSystemPagesPerSlotSpan = partitionBucketNumSystemPages(bucket->sl
otSize); | 139 bucket->numSystemPagesPerSlotSpan = partitionBucketNumSystemPages(bucket->sl
otSize); |
| 139 } | 140 } |
| 140 | 141 |
| 142 void partitionAllocGlobalInit(void (*oomHandlingFunction)()) |
| 143 { |
| 144 ASSERT(oomHandlingFunction); |
| 145 PartitionRootBase::gOomHandlingFunction = oomHandlingFunction; |
| 146 } |
| 147 |
| 141 void partitionAllocInit(PartitionRoot* root, size_t numBuckets, size_t maxAlloca
tion) | 148 void partitionAllocInit(PartitionRoot* root, size_t numBuckets, size_t maxAlloca
tion) |
| 142 { | 149 { |
| 143 partitionAllocBaseInit(root); | 150 partitionAllocBaseInit(root); |
| 144 | 151 |
| 145 root->numBuckets = numBuckets; | 152 root->numBuckets = numBuckets; |
| 146 root->maxAllocation = maxAllocation; | 153 root->maxAllocation = maxAllocation; |
| 147 size_t i; | 154 size_t i; |
| 148 for (i = 0; i < root->numBuckets; ++i) { | 155 for (i = 0; i < root->numBuckets; ++i) { |
| 149 PartitionBucket* bucket = &root->buckets()[i]; | 156 PartitionBucket* bucket = &root->buckets()[i]; |
| 150 if (!i) | 157 if (!i) |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 | 308 |
| 302 static NEVER_INLINE void partitionOutOfMemory(const PartitionRootBase* root) | 309 static NEVER_INLINE void partitionOutOfMemory(const PartitionRootBase* root) |
| 303 { | 310 { |
| 304 #if !CPU(64BIT) | 311 #if !CPU(64BIT) |
| 305 // Check whether this OOM is due to a lot of super pages that are allocated | 312 // Check whether this OOM is due to a lot of super pages that are allocated |
| 306 // but not committed, probably due to http://crbug.com/421387. | 313 // but not committed, probably due to http://crbug.com/421387. |
| 307 if (root->totalSizeOfSuperPages + root->totalSizeOfDirectMappedPages - root-
>totalSizeOfCommittedPages > kReasonableSizeOfUnusedPages) { | 314 if (root->totalSizeOfSuperPages + root->totalSizeOfDirectMappedPages - root-
>totalSizeOfCommittedPages > kReasonableSizeOfUnusedPages) { |
| 308 partitionOutOfMemoryWithLotsOfUncommitedPages(); | 315 partitionOutOfMemoryWithLotsOfUncommitedPages(); |
| 309 } | 316 } |
| 310 #endif | 317 #endif |
| 318 if (PartitionRootBase::gOomHandlingFunction) |
| 319 (*PartitionRootBase::gOomHandlingFunction)(); |
| 311 IMMEDIATE_CRASH(); | 320 IMMEDIATE_CRASH(); |
| 312 } | 321 } |
| 313 | 322 |
| 314 static NEVER_INLINE void partitionExcessiveAllocationSize() | 323 static NEVER_INLINE void partitionExcessiveAllocationSize() |
| 315 { | 324 { |
| 316 IMMEDIATE_CRASH(); | 325 IMMEDIATE_CRASH(); |
| 317 } | 326 } |
| 318 | 327 |
| 319 static NEVER_INLINE void partitionBucketFull() | 328 static NEVER_INLINE void partitionBucketFull() |
| 320 { | 329 { |
| (...skipping 1075 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1396 partitionStats.totalDiscardableBytes += memoryStats[i].discardableBy
tes; | 1405 partitionStats.totalDiscardableBytes += memoryStats[i].discardableBy
tes; |
| 1397 if (!isLightDump) | 1406 if (!isLightDump) |
| 1398 partitionStatsDumper->partitionsDumpBucketStats(partitionName, &
memoryStats[i]); | 1407 partitionStatsDumper->partitionsDumpBucketStats(partitionName, &
memoryStats[i]); |
| 1399 } | 1408 } |
| 1400 } | 1409 } |
| 1401 partitionStatsDumper->partitionDumpTotals(partitionName, &partitionStats); | 1410 partitionStatsDumper->partitionDumpTotals(partitionName, &partitionStats); |
| 1402 } | 1411 } |
| 1403 | 1412 |
| 1404 } // namespace WTF | 1413 } // namespace WTF |
| 1405 | 1414 |
| OLD | NEW |