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 "src/allocation.h" | 8 #include "src/allocation.h" |
9 #include "src/atomic-utils.h" | 9 #include "src/atomic-utils.h" |
10 #include "src/base/atomicops.h" | 10 #include "src/base/atomicops.h" |
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
401 + kPointerSize // SlotSet* old_to_old_slots_; | 401 + kPointerSize // SlotSet* old_to_old_slots_; |
402 + kPointerSize; // SkipList* skip_list_; | 402 + kPointerSize; // SkipList* skip_list_; |
403 | 403 |
404 static const size_t kMinHeaderSize = | 404 static const size_t kMinHeaderSize = |
405 kWriteBarrierCounterOffset + | 405 kWriteBarrierCounterOffset + |
406 kIntptrSize // intptr_t write_barrier_counter_ | 406 kIntptrSize // intptr_t write_barrier_counter_ |
407 + kPointerSize // AtomicValue high_water_mark_ | 407 + kPointerSize // AtomicValue high_water_mark_ |
408 + kPointerSize // base::Mutex* mutex_ | 408 + kPointerSize // base::Mutex* mutex_ |
409 + kPointerSize // base::AtomicWord parallel_sweeping_ | 409 + kPointerSize // base::AtomicWord parallel_sweeping_ |
410 + kPointerSize // AtomicValue parallel_compaction_ | 410 + kPointerSize // AtomicValue parallel_compaction_ |
411 + 5 * kPointerSize // AtomicNumber free-list statistics | 411 + 2 * kPointerSize // AtomicNumber free-list statistics |
412 + kPointerSize // AtomicValue next_chunk_ | 412 + kPointerSize // AtomicValue next_chunk_ |
413 + kPointerSize; // AtomicValue prev_chunk_ | 413 + kPointerSize; // AtomicValue prev_chunk_ |
414 | 414 |
415 // We add some more space to the computed header size to amount for missing | 415 // We add some more space to the computed header size to amount for missing |
416 // alignment requirements in our computation. | 416 // alignment requirements in our computation. |
417 // Try to get kHeaderSize properly aligned on 32-bit and 64-bit machines. | 417 // Try to get kHeaderSize properly aligned on 32-bit and 64-bit machines. |
418 static const size_t kHeaderSize = kMinHeaderSize; | 418 static const size_t kHeaderSize = kMinHeaderSize; |
419 | 419 |
420 static const int kBodyOffset = | 420 static const int kBodyOffset = |
421 CODE_POINTER_ALIGN(kHeaderSize + Bitmap::kSize); | 421 CODE_POINTER_ALIGN(kHeaderSize + Bitmap::kSize); |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
698 // Assuming the initial allocation on a page is sequential, | 698 // Assuming the initial allocation on a page is sequential, |
699 // count highest number of bytes ever allocated on the page. | 699 // count highest number of bytes ever allocated on the page. |
700 AtomicValue<intptr_t> high_water_mark_; | 700 AtomicValue<intptr_t> high_water_mark_; |
701 | 701 |
702 base::Mutex* mutex_; | 702 base::Mutex* mutex_; |
703 | 703 |
704 AtomicValue<ConcurrentSweepingState> concurrent_sweeping_; | 704 AtomicValue<ConcurrentSweepingState> concurrent_sweeping_; |
705 AtomicValue<ParallelCompactingState> parallel_compaction_; | 705 AtomicValue<ParallelCompactingState> parallel_compaction_; |
706 | 706 |
707 // PagedSpace free-list statistics. | 707 // PagedSpace free-list statistics. |
708 AtomicNumber<intptr_t> available_in_small_free_list_; | 708 AtomicNumber<intptr_t> available_in_free_list_; |
709 AtomicNumber<intptr_t> available_in_medium_free_list_; | 709 AtomicNumber<intptr_t> wasted_memory_; |
710 AtomicNumber<intptr_t> available_in_large_free_list_; | |
711 AtomicNumber<intptr_t> available_in_huge_free_list_; | |
712 AtomicNumber<intptr_t> non_available_small_blocks_; | |
713 | 710 |
714 // next_chunk_ holds a pointer of type MemoryChunk | 711 // next_chunk_ holds a pointer of type MemoryChunk |
715 AtomicValue<MemoryChunk*> next_chunk_; | 712 AtomicValue<MemoryChunk*> next_chunk_; |
716 // prev_chunk_ holds a pointer of type MemoryChunk | 713 // prev_chunk_ holds a pointer of type MemoryChunk |
717 AtomicValue<MemoryChunk*> prev_chunk_; | 714 AtomicValue<MemoryChunk*> prev_chunk_; |
718 | 715 |
719 private: | 716 private: |
720 void InitializeReservedMemory() { reservation_.Reset(); } | 717 void InitializeReservedMemory() { reservation_.Reset(); } |
721 | 718 |
722 friend class MemoryAllocator; | 719 friend class MemoryAllocator; |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
826 DCHECK(SweepingDone()); | 823 DCHECK(SweepingDone()); |
827 } | 824 } |
828 | 825 |
829 bool SweepingDone() { | 826 bool SweepingDone() { |
830 return concurrent_sweeping_state().Value() == kSweepingDone; | 827 return concurrent_sweeping_state().Value() == kSweepingDone; |
831 } | 828 } |
832 | 829 |
833 void ResetFreeListStatistics(); | 830 void ResetFreeListStatistics(); |
834 | 831 |
835 int LiveBytesFromFreeList() { | 832 int LiveBytesFromFreeList() { |
836 return static_cast<int>( | 833 return static_cast<int>(area_size() - wasted_memory() - |
837 area_size() - non_available_small_blocks() - | 834 available_in_free_list()); |
838 available_in_small_free_list() - available_in_medium_free_list() - | |
839 available_in_large_free_list() - available_in_huge_free_list()); | |
840 } | 835 } |
841 | 836 |
842 #define FRAGMENTATION_STATS_ACCESSORS(type, name) \ | 837 #define FRAGMENTATION_STATS_ACCESSORS(type, name) \ |
843 type name() { return name##_.Value(); } \ | 838 type name() { return name##_.Value(); } \ |
844 void set_##name(type name) { name##_.SetValue(name); } \ | 839 void set_##name(type name) { name##_.SetValue(name); } \ |
845 void add_##name(type name) { name##_.Increment(name); } | 840 void add_##name(type name) { name##_.Increment(name); } |
846 | 841 |
847 FRAGMENTATION_STATS_ACCESSORS(intptr_t, non_available_small_blocks) | 842 FRAGMENTATION_STATS_ACCESSORS(intptr_t, wasted_memory) |
848 FRAGMENTATION_STATS_ACCESSORS(intptr_t, available_in_small_free_list) | 843 FRAGMENTATION_STATS_ACCESSORS(intptr_t, available_in_free_list) |
849 FRAGMENTATION_STATS_ACCESSORS(intptr_t, available_in_medium_free_list) | |
850 FRAGMENTATION_STATS_ACCESSORS(intptr_t, available_in_large_free_list) | |
851 FRAGMENTATION_STATS_ACCESSORS(intptr_t, available_in_huge_free_list) | |
852 | 844 |
853 #undef FRAGMENTATION_STATS_ACCESSORS | 845 #undef FRAGMENTATION_STATS_ACCESSORS |
854 | 846 |
855 void add_available_in_free_list(FreeListCategoryType type, intptr_t bytes) { | |
856 switch (type) { | |
857 case kSmall: | |
858 add_available_in_small_free_list(bytes); | |
859 break; | |
860 case kMedium: | |
861 add_available_in_medium_free_list(bytes); | |
862 break; | |
863 case kLarge: | |
864 add_available_in_large_free_list(bytes); | |
865 break; | |
866 case kHuge: | |
867 add_available_in_huge_free_list(bytes); | |
868 break; | |
869 default: | |
870 UNREACHABLE(); | |
871 } | |
872 } | |
873 | |
874 intptr_t available_in_free_list(FreeListCategoryType type) { | |
875 switch (type) { | |
876 case kSmall: | |
877 return available_in_small_free_list(); | |
878 case kMedium: | |
879 return available_in_medium_free_list(); | |
880 case kLarge: | |
881 return available_in_large_free_list(); | |
882 case kHuge: | |
883 return available_in_huge_free_list(); | |
884 default: | |
885 UNREACHABLE(); | |
886 } | |
887 UNREACHABLE(); | |
888 return 0; | |
889 } | |
890 | |
891 #ifdef DEBUG | 847 #ifdef DEBUG |
892 void Print(); | 848 void Print(); |
893 #endif // DEBUG | 849 #endif // DEBUG |
894 | 850 |
895 friend class MemoryAllocator; | 851 friend class MemoryAllocator; |
896 }; | 852 }; |
897 | 853 |
898 | 854 |
899 class LargePage : public MemoryChunk { | 855 class LargePage : public MemoryChunk { |
900 public: | 856 public: |
(...skipping 891 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1792 static const int kMediumAllocationMax = kSmallListMax; | 1748 static const int kMediumAllocationMax = kSmallListMax; |
1793 static const int kLargeAllocationMax = kMediumListMax; | 1749 static const int kLargeAllocationMax = kMediumListMax; |
1794 | 1750 |
1795 FreeSpace* FindNodeFor(int size_in_bytes, int* node_size); | 1751 FreeSpace* FindNodeFor(int size_in_bytes, int* node_size); |
1796 FreeSpace* FindNodeIn(FreeListCategoryType category, int* node_size); | 1752 FreeSpace* FindNodeIn(FreeListCategoryType category, int* node_size); |
1797 | 1753 |
1798 FreeListCategory* GetFreeListCategory(FreeListCategoryType category) { | 1754 FreeListCategory* GetFreeListCategory(FreeListCategoryType category) { |
1799 return &category_[category]; | 1755 return &category_[category]; |
1800 } | 1756 } |
1801 | 1757 |
| 1758 FreeListCategoryType SelectFreeListCategoryType(size_t size_in_bytes) { |
| 1759 if (size_in_bytes <= kSmallListMax) { |
| 1760 return kSmall; |
| 1761 } else if (size_in_bytes <= kMediumListMax) { |
| 1762 return kMedium; |
| 1763 } else if (size_in_bytes <= kLargeListMax) { |
| 1764 return kLarge; |
| 1765 } |
| 1766 return kHuge; |
| 1767 } |
| 1768 |
| 1769 FreeListCategoryType SelectFastAllocationFreeListCategoryType( |
| 1770 size_t size_in_bytes) { |
| 1771 if (size_in_bytes <= kSmallAllocationMax) { |
| 1772 return kSmall; |
| 1773 } else if (size_in_bytes <= kMediumAllocationMax) { |
| 1774 return kMedium; |
| 1775 } else if (size_in_bytes <= kLargeAllocationMax) { |
| 1776 return kLarge; |
| 1777 } |
| 1778 return kHuge; |
| 1779 } |
| 1780 |
1802 PagedSpace* owner_; | 1781 PagedSpace* owner_; |
1803 base::Mutex mutex_; | 1782 base::Mutex mutex_; |
1804 intptr_t wasted_bytes_; | 1783 intptr_t wasted_bytes_; |
1805 FreeListCategory category_[kNumberOfCategories]; | 1784 FreeListCategory category_[kNumberOfCategories]; |
1806 | 1785 |
1807 DISALLOW_IMPLICIT_CONSTRUCTORS(FreeList); | 1786 DISALLOW_IMPLICIT_CONSTRUCTORS(FreeList); |
1808 }; | 1787 }; |
1809 | 1788 |
1810 | 1789 |
1811 class AllocationResult { | 1790 class AllocationResult { |
(...skipping 1227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3039 count = 0; | 3018 count = 0; |
3040 } | 3019 } |
3041 // Must be small, since an iteration is used for lookup. | 3020 // Must be small, since an iteration is used for lookup. |
3042 static const int kMaxComments = 64; | 3021 static const int kMaxComments = 64; |
3043 }; | 3022 }; |
3044 #endif | 3023 #endif |
3045 } // namespace internal | 3024 } // namespace internal |
3046 } // namespace v8 | 3025 } // namespace v8 |
3047 | 3026 |
3048 #endif // V8_HEAP_SPACES_H_ | 3027 #endif // V8_HEAP_SPACES_H_ |
OLD | NEW |