| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_HEAP_SPACES_H_ | 5 #ifndef V8_HEAP_SPACES_H_ |
| 6 #define V8_HEAP_SPACES_H_ | 6 #define V8_HEAP_SPACES_H_ |
| 7 | 7 |
| 8 #include <list> | 8 #include <list> |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <unordered_set> | 10 #include <unordered_set> |
| (...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 336 + kPointerSize // TypedSlotSet* typed_old_to_old_slots_ | 336 + kPointerSize // TypedSlotSet* typed_old_to_old_slots_ |
| 337 + kPointerSize // SkipList* skip_list_ | 337 + kPointerSize // SkipList* skip_list_ |
| 338 + kPointerSize // AtomicValue high_water_mark_ | 338 + kPointerSize // AtomicValue high_water_mark_ |
| 339 + kPointerSize // base::Mutex* mutex_ | 339 + kPointerSize // base::Mutex* mutex_ |
| 340 + kPointerSize // base::AtomicWord concurrent_sweeping_ | 340 + kPointerSize // base::AtomicWord concurrent_sweeping_ |
| 341 + 2 * kSizetSize // AtomicNumber free-list statistics | 341 + 2 * kSizetSize // AtomicNumber free-list statistics |
| 342 + kPointerSize // AtomicValue next_chunk_ | 342 + kPointerSize // AtomicValue next_chunk_ |
| 343 + kPointerSize // AtomicValue prev_chunk_ | 343 + kPointerSize // AtomicValue prev_chunk_ |
| 344 // FreeListCategory categories_[kNumberOfCategories] | 344 // FreeListCategory categories_[kNumberOfCategories] |
| 345 + FreeListCategory::kSize * kNumberOfCategories + | 345 + FreeListCategory::kSize * kNumberOfCategories + |
| 346 kPointerSize // LocalArrayBufferTracker* local_tracker_ | 346 kPointerSize; // LocalArrayBufferTracker* local_tracker_ |
| 347 // std::unordered_set<Address>* black_area_end_marker_map_ | |
| 348 + kPointerSize; | |
| 349 | 347 |
| 350 // We add some more space to the computed header size to amount for missing | 348 // We add some more space to the computed header size to amount for missing |
| 351 // alignment requirements in our computation. | 349 // alignment requirements in our computation. |
| 352 // Try to get kHeaderSize properly aligned on 32-bit and 64-bit machines. | 350 // Try to get kHeaderSize properly aligned on 32-bit and 64-bit machines. |
| 353 static const size_t kHeaderSize = kMinHeaderSize; | 351 static const size_t kHeaderSize = kMinHeaderSize; |
| 354 | 352 |
| 355 static const int kBodyOffset = | 353 static const int kBodyOffset = |
| 356 CODE_POINTER_ALIGN(kHeaderSize + Bitmap::kSize); | 354 CODE_POINTER_ALIGN(kHeaderSize + Bitmap::kSize); |
| 357 | 355 |
| 358 // The start offset of the object area in a page. Aligned to both maps and | 356 // The start offset of the object area in a page. Aligned to both maps and |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 569 owner_ = reinterpret_cast<Address>(space) + kPageHeaderTag; | 567 owner_ = reinterpret_cast<Address>(space) + kPageHeaderTag; |
| 570 DCHECK((reinterpret_cast<intptr_t>(owner_) & kPageHeaderTagMask) == | 568 DCHECK((reinterpret_cast<intptr_t>(owner_) & kPageHeaderTagMask) == |
| 571 kPageHeaderTag); | 569 kPageHeaderTag); |
| 572 } | 570 } |
| 573 | 571 |
| 574 bool HasPageHeader() { return owner() != nullptr; } | 572 bool HasPageHeader() { return owner() != nullptr; } |
| 575 | 573 |
| 576 void InsertAfter(MemoryChunk* other); | 574 void InsertAfter(MemoryChunk* other); |
| 577 void Unlink(); | 575 void Unlink(); |
| 578 | 576 |
| 579 void ReleaseBlackAreaEndMarkerMap() { | |
| 580 if (black_area_end_marker_map_) { | |
| 581 delete black_area_end_marker_map_; | |
| 582 black_area_end_marker_map_ = nullptr; | |
| 583 } | |
| 584 } | |
| 585 | |
| 586 bool IsBlackAreaEndMarker(Address address) { | |
| 587 if (black_area_end_marker_map_) { | |
| 588 return black_area_end_marker_map_->find(address) != | |
| 589 black_area_end_marker_map_->end(); | |
| 590 } | |
| 591 return false; | |
| 592 } | |
| 593 | |
| 594 void AddBlackAreaEndMarker(Address address) { | |
| 595 if (!black_area_end_marker_map_) { | |
| 596 black_area_end_marker_map_ = new std::unordered_set<Address>(); | |
| 597 } | |
| 598 auto ret = black_area_end_marker_map_->insert(address); | |
| 599 USE(ret); | |
| 600 // Check that we inserted a new black area end marker. | |
| 601 DCHECK(ret.second); | |
| 602 } | |
| 603 | |
| 604 bool HasBlackAreas() { return black_area_end_marker_map_ != nullptr; } | |
| 605 | |
| 606 protected: | 577 protected: |
| 607 static MemoryChunk* Initialize(Heap* heap, Address base, size_t size, | 578 static MemoryChunk* Initialize(Heap* heap, Address base, size_t size, |
| 608 Address area_start, Address area_end, | 579 Address area_start, Address area_end, |
| 609 Executability executable, Space* owner, | 580 Executability executable, Space* owner, |
| 610 base::VirtualMemory* reservation); | 581 base::VirtualMemory* reservation); |
| 611 | 582 |
| 612 // Should be called when memory chunk is about to be freed. | 583 // Should be called when memory chunk is about to be freed. |
| 613 void ReleaseAllocatedMemory(); | 584 void ReleaseAllocatedMemory(); |
| 614 | 585 |
| 615 base::VirtualMemory* reserved_memory() { return &reservation_; } | 586 base::VirtualMemory* reserved_memory() { return &reservation_; } |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 662 | 633 |
| 663 // next_chunk_ holds a pointer of type MemoryChunk | 634 // next_chunk_ holds a pointer of type MemoryChunk |
| 664 base::AtomicValue<MemoryChunk*> next_chunk_; | 635 base::AtomicValue<MemoryChunk*> next_chunk_; |
| 665 // prev_chunk_ holds a pointer of type MemoryChunk | 636 // prev_chunk_ holds a pointer of type MemoryChunk |
| 666 base::AtomicValue<MemoryChunk*> prev_chunk_; | 637 base::AtomicValue<MemoryChunk*> prev_chunk_; |
| 667 | 638 |
| 668 FreeListCategory categories_[kNumberOfCategories]; | 639 FreeListCategory categories_[kNumberOfCategories]; |
| 669 | 640 |
| 670 LocalArrayBufferTracker* local_tracker_; | 641 LocalArrayBufferTracker* local_tracker_; |
| 671 | 642 |
| 672 // Stores the end addresses of black areas. | |
| 673 std::unordered_set<Address>* black_area_end_marker_map_; | |
| 674 | |
| 675 private: | 643 private: |
| 676 void InitializeReservedMemory() { reservation_.Reset(); } | 644 void InitializeReservedMemory() { reservation_.Reset(); } |
| 677 | 645 |
| 678 friend class MemoryAllocator; | 646 friend class MemoryAllocator; |
| 679 friend class MemoryChunkValidator; | 647 friend class MemoryChunkValidator; |
| 680 }; | 648 }; |
| 681 | 649 |
| 682 DEFINE_OPERATORS_FOR_FLAGS(MemoryChunk::Flags) | 650 DEFINE_OPERATORS_FOR_FLAGS(MemoryChunk::Flags) |
| 683 | 651 |
| 684 static_assert(kMaxRegularHeapObjectSize <= MemoryChunk::kAllocatableMemory, | 652 static_assert(kMaxRegularHeapObjectSize <= MemoryChunk::kAllocatableMemory, |
| (...skipping 2248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2933 PageIterator old_iterator_; | 2901 PageIterator old_iterator_; |
| 2934 PageIterator code_iterator_; | 2902 PageIterator code_iterator_; |
| 2935 PageIterator map_iterator_; | 2903 PageIterator map_iterator_; |
| 2936 LargePageIterator lo_iterator_; | 2904 LargePageIterator lo_iterator_; |
| 2937 }; | 2905 }; |
| 2938 | 2906 |
| 2939 } // namespace internal | 2907 } // namespace internal |
| 2940 } // namespace v8 | 2908 } // namespace v8 |
| 2941 | 2909 |
| 2942 #endif // V8_HEAP_SPACES_H_ | 2910 #endif // V8_HEAP_SPACES_H_ |
| OLD | NEW |