| 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 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 #else | 122 #else |
| 123 #define USE_4BYTE_HEADER_PADDING 0 | 123 #define USE_4BYTE_HEADER_PADDING 0 |
| 124 #endif | 124 #endif |
| 125 | 125 |
| 126 class CallbackStack; | 126 class CallbackStack; |
| 127 class FreePagePool; | 127 class FreePagePool; |
| 128 class NormalPageHeap; | 128 class NormalPageHeap; |
| 129 class OrphanedPagePool; | 129 class OrphanedPagePool; |
| 130 class PageMemory; | 130 class PageMemory; |
| 131 class PageMemoryRegion; | 131 class PageMemoryRegion; |
| 132 class WebProcessMemoryDump; | 132 class WebMemoryAllocatorDump; |
| 133 | 133 |
| 134 // HeapObjectHeader is 4 byte (32 bit) that has the following layout: | 134 // HeapObjectHeader is 4 byte (32 bit) that has the following layout: |
| 135 // | 135 // |
| 136 // | gcInfoIndex (14 bit) | DOM mark bit (1 bit) | size (14 bit) | dead bit (1 b
it) | freed bit (1 bit) | mark bit (1 bit) | | 136 // | gcInfoIndex (14 bit) | DOM mark bit (1 bit) | size (14 bit) | dead bit (1 b
it) | freed bit (1 bit) | mark bit (1 bit) | |
| 137 // | 137 // |
| 138 // - For non-large objects, 14 bit is enough for |size| because the blink | 138 // - For non-large objects, 14 bit is enough for |size| because the blink |
| 139 // page size is 2^17 byte and each object is guaranteed to be aligned with | 139 // page size is 2^17 byte and each object is guaranteed to be aligned with |
| 140 // 2^3 byte. | 140 // 2^3 byte. |
| 141 // - For large objects, |size| is 0. The actual size of a large object is | 141 // - For large objects, |size| is 0. The actual size of a large object is |
| 142 // stored in LargeObjectPage::m_payloadSize. | 142 // stored in LargeObjectPage::m_payloadSize. |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 // heap page. If so, find the start of that object and mark it | 385 // heap page. If so, find the start of that object and mark it |
| 386 // using the given Visitor. Otherwise do nothing. The pointer must | 386 // using the given Visitor. Otherwise do nothing. The pointer must |
| 387 // be within the same aligned blinkPageSize as the this-pointer. | 387 // be within the same aligned blinkPageSize as the this-pointer. |
| 388 // | 388 // |
| 389 // This is used during conservative stack scanning to | 389 // This is used during conservative stack scanning to |
| 390 // conservatively mark all objects that could be referenced from | 390 // conservatively mark all objects that could be referenced from |
| 391 // the stack. | 391 // the stack. |
| 392 virtual void checkAndMarkPointer(Visitor*, Address) = 0; | 392 virtual void checkAndMarkPointer(Visitor*, Address) = 0; |
| 393 virtual void markOrphaned(); | 393 virtual void markOrphaned(); |
| 394 | 394 |
| 395 virtual void takeSnapshot(String dumpBaseName, size_t pageIndex, ThreadState
::GCSnapshotInfo&, size_t* outFreeSize, size_t* outFreeCount) = 0; | 395 class HeapSnapshotInfo { |
| 396 STACK_ALLOCATED(); |
| 397 public: |
| 398 size_t freeCount = 0; |
| 399 size_t freeSize = 0; |
| 400 }; |
| 401 |
| 402 virtual void takeSnapshot(WebMemoryAllocatorDump*, ThreadState::GCSnapshotIn
fo&, HeapSnapshotInfo&) = 0; |
| 396 #if ENABLE(ASSERT) | 403 #if ENABLE(ASSERT) |
| 397 virtual bool contains(Address) = 0; | 404 virtual bool contains(Address) = 0; |
| 398 #endif | 405 #endif |
| 399 virtual size_t size() = 0; | 406 virtual size_t size() = 0; |
| 400 virtual bool isLargeObjectPage() { return false; } | 407 virtual bool isLargeObjectPage() { return false; } |
| 401 | 408 |
| 402 Address address() { return reinterpret_cast<Address>(this); } | 409 Address address() { return reinterpret_cast<Address>(this); } |
| 403 PageMemory* storage() const { return m_storage; } | 410 PageMemory* storage() const { return m_storage; } |
| 404 BaseHeap* heap() const { return m_heap; } | 411 BaseHeap* heap() const { return m_heap; } |
| 405 bool orphaned() { return !m_heap; } | 412 bool orphaned() { return !m_heap; } |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 461 void sweep() override; | 468 void sweep() override; |
| 462 void makeConsistentForGC() override; | 469 void makeConsistentForGC() override; |
| 463 void makeConsistentForMutator() override; | 470 void makeConsistentForMutator() override; |
| 464 void invalidateObjectStartBitmap() override { m_objectStartBitMapComputed =
false; } | 471 void invalidateObjectStartBitmap() override { m_objectStartBitMapComputed =
false; } |
| 465 #if defined(ADDRESS_SANITIZER) | 472 #if defined(ADDRESS_SANITIZER) |
| 466 void poisonObjects(BlinkGC::ObjectsToPoison, BlinkGC::Poisoning) override; | 473 void poisonObjects(BlinkGC::ObjectsToPoison, BlinkGC::Poisoning) override; |
| 467 #endif | 474 #endif |
| 468 void checkAndMarkPointer(Visitor*, Address) override; | 475 void checkAndMarkPointer(Visitor*, Address) override; |
| 469 void markOrphaned() override; | 476 void markOrphaned() override; |
| 470 | 477 |
| 471 void takeSnapshot(String dumpBaseName, size_t pageIndex, ThreadState::GCSnap
shotInfo&, size_t* outFreeSize, size_t* outFreeCount) override; | 478 void takeSnapshot(WebMemoryAllocatorDump*, ThreadState::GCSnapshotInfo&, Hea
pSnapshotInfo&) override; |
| 472 #if ENABLE(ASSERT) | 479 #if ENABLE(ASSERT) |
| 473 // Returns true for the whole blinkPageSize page that the page is on, even | 480 // Returns true for the whole blinkPageSize page that the page is on, even |
| 474 // for the header, and the unmapped guard page at the start. That ensures | 481 // for the header, and the unmapped guard page at the start. That ensures |
| 475 // the result can be used to populate the negative page cache. | 482 // the result can be used to populate the negative page cache. |
| 476 bool contains(Address) override; | 483 bool contains(Address) override; |
| 477 #endif | 484 #endif |
| 478 size_t size() override { return blinkPageSize; } | 485 size_t size() override { return blinkPageSize; } |
| 479 static size_t pageHeaderSize() | 486 static size_t pageHeaderSize() |
| 480 { | 487 { |
| 481 // Compute the amount of padding we have to add to a header to make | 488 // Compute the amount of padding we have to add to a header to make |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 518 void sweep() override; | 525 void sweep() override; |
| 519 void makeConsistentForGC() override; | 526 void makeConsistentForGC() override; |
| 520 void makeConsistentForMutator() override; | 527 void makeConsistentForMutator() override; |
| 521 void invalidateObjectStartBitmap() override { } | 528 void invalidateObjectStartBitmap() override { } |
| 522 #if defined(ADDRESS_SANITIZER) | 529 #if defined(ADDRESS_SANITIZER) |
| 523 void poisonObjects(BlinkGC::ObjectsToPoison, BlinkGC::Poisoning) override; | 530 void poisonObjects(BlinkGC::ObjectsToPoison, BlinkGC::Poisoning) override; |
| 524 #endif | 531 #endif |
| 525 void checkAndMarkPointer(Visitor*, Address) override; | 532 void checkAndMarkPointer(Visitor*, Address) override; |
| 526 void markOrphaned() override; | 533 void markOrphaned() override; |
| 527 | 534 |
| 528 void takeSnapshot(String dumpBaseName, size_t pageIndex, ThreadState::GCSnap
shotInfo&, size_t* outFreeSize, size_t* outFreeCount) override; | 535 void takeSnapshot(WebMemoryAllocatorDump*, ThreadState::GCSnapshotInfo&, Hea
pSnapshotInfo&) override; |
| 529 #if ENABLE(ASSERT) | 536 #if ENABLE(ASSERT) |
| 530 // Returns true for any address that is on one of the pages that this | 537 // Returns true for any address that is on one of the pages that this |
| 531 // large object uses. That ensures that we can use a negative result to | 538 // large object uses. That ensures that we can use a negative result to |
| 532 // populate the negative page cache. | 539 // populate the negative page cache. |
| 533 bool contains(Address) override; | 540 bool contains(Address) override; |
| 534 #endif | 541 #endif |
| 535 virtual size_t size() | 542 virtual size_t size() |
| 536 { | 543 { |
| 537 return pageHeaderSize() + sizeof(HeapObjectHeader) + m_payloadSize; | 544 return pageHeaderSize() + sizeof(HeapObjectHeader) + m_payloadSize; |
| 538 } | 545 } |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 879 SET_MEMORY_ACCESSIBLE(result, allocationSize - sizeof(HeapObjectHeader))
; | 886 SET_MEMORY_ACCESSIBLE(result, allocationSize - sizeof(HeapObjectHeader))
; |
| 880 ASSERT(findPageFromAddress(headerAddress + allocationSize - 1)); | 887 ASSERT(findPageFromAddress(headerAddress + allocationSize - 1)); |
| 881 return result; | 888 return result; |
| 882 } | 889 } |
| 883 return outOfLineAllocate(allocationSize, gcInfoIndex); | 890 return outOfLineAllocate(allocationSize, gcInfoIndex); |
| 884 } | 891 } |
| 885 | 892 |
| 886 } // namespace blink | 893 } // namespace blink |
| 887 | 894 |
| 888 #endif // HeapPage_h | 895 #endif // HeapPage_h |
| OLD | NEW |