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 #include "v8.h" | 5 #include "v8.h" |
6 | 6 |
7 #include "full-codegen.h" | 7 #include "full-codegen.h" |
8 #include "macro-assembler.h" | 8 #include "macro-assembler.h" |
9 #include "mark-compact.h" | 9 #include "mark-compact.h" |
10 #include "msan.h" | 10 #include "msan.h" |
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
552 MemoryChunk* other_next = other->next_chunk(); | 552 MemoryChunk* other_next = other->next_chunk(); |
553 | 553 |
554 set_next_chunk(other_next); | 554 set_next_chunk(other_next); |
555 set_prev_chunk(other); | 555 set_prev_chunk(other); |
556 other_next->set_prev_chunk(this); | 556 other_next->set_prev_chunk(this); |
557 other->set_next_chunk(this); | 557 other->set_next_chunk(this); |
558 } | 558 } |
559 | 559 |
560 | 560 |
561 void MemoryChunk::Unlink() { | 561 void MemoryChunk::Unlink() { |
562 if (!InNewSpace() && IsFlagSet(SCAN_ON_SCAVENGE)) { | |
563 heap_->decrement_scan_on_scavenge_pages(); | |
564 ClearFlag(SCAN_ON_SCAVENGE); | |
565 } | |
566 MemoryChunk* next_element = next_chunk(); | 562 MemoryChunk* next_element = next_chunk(); |
567 MemoryChunk* prev_element = prev_chunk(); | 563 MemoryChunk* prev_element = prev_chunk(); |
568 next_element->set_prev_chunk(prev_element); | 564 next_element->set_prev_chunk(prev_element); |
569 prev_element->set_next_chunk(next_element); | 565 prev_element->set_next_chunk(next_element); |
570 set_prev_chunk(NULL); | 566 set_prev_chunk(NULL); |
571 set_next_chunk(NULL); | 567 set_next_chunk(NULL); |
572 } | 568 } |
573 | 569 |
574 | 570 |
575 MemoryChunk* MemoryAllocator::AllocateChunk(intptr_t reserve_area_size, | 571 MemoryChunk* MemoryAllocator::AllocateChunk(intptr_t reserve_area_size, |
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
923 // ----------------------------------------------------------------------------- | 919 // ----------------------------------------------------------------------------- |
924 // PagedSpace implementation | 920 // PagedSpace implementation |
925 | 921 |
926 PagedSpace::PagedSpace(Heap* heap, | 922 PagedSpace::PagedSpace(Heap* heap, |
927 intptr_t max_capacity, | 923 intptr_t max_capacity, |
928 AllocationSpace id, | 924 AllocationSpace id, |
929 Executability executable) | 925 Executability executable) |
930 : Space(heap, id, executable), | 926 : Space(heap, id, executable), |
931 free_list_(this), | 927 free_list_(this), |
932 was_swept_conservatively_(false), | 928 was_swept_conservatively_(false), |
933 unswept_free_bytes_(0) { | 929 unswept_free_bytes_(0), |
| 930 end_of_unswept_pages_(NULL) { |
934 if (id == CODE_SPACE) { | 931 if (id == CODE_SPACE) { |
935 area_size_ = heap->isolate()->memory_allocator()-> | 932 area_size_ = heap->isolate()->memory_allocator()-> |
936 CodePageAreaSize(); | 933 CodePageAreaSize(); |
937 } else { | 934 } else { |
938 area_size_ = Page::kPageSize - Page::kObjectStartOffset; | 935 area_size_ = Page::kPageSize - Page::kObjectStartOffset; |
939 } | 936 } |
940 max_capacity_ = (RoundDown(max_capacity, Page::kPageSize) / Page::kPageSize) | 937 max_capacity_ = (RoundDown(max_capacity, Page::kPageSize) / Page::kPageSize) |
941 * AreaSize(); | 938 * AreaSize(); |
942 accounting_stats_.Clear(); | 939 accounting_stats_.Clear(); |
943 | 940 |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1096 page->ResetFreeListStatistics(); | 1093 page->ResetFreeListStatistics(); |
1097 } | 1094 } |
1098 } | 1095 } |
1099 | 1096 |
1100 | 1097 |
1101 void PagedSpace::IncreaseCapacity(int size) { | 1098 void PagedSpace::IncreaseCapacity(int size) { |
1102 accounting_stats_.ExpandSpace(size); | 1099 accounting_stats_.ExpandSpace(size); |
1103 } | 1100 } |
1104 | 1101 |
1105 | 1102 |
1106 void PagedSpace::ReleasePage(Page* page, bool unlink) { | 1103 void PagedSpace::ReleasePage(Page* page) { |
1107 ASSERT(page->LiveBytes() == 0); | 1104 ASSERT(page->LiveBytes() == 0); |
1108 ASSERT(AreaSize() == page->area_size()); | 1105 ASSERT(AreaSize() == page->area_size()); |
1109 | 1106 |
1110 if (page->WasSwept()) { | 1107 if (page->WasSwept()) { |
1111 intptr_t size = free_list_.EvictFreeListItems(page); | 1108 intptr_t size = free_list_.EvictFreeListItems(page); |
1112 accounting_stats_.AllocateBytes(size); | 1109 accounting_stats_.AllocateBytes(size); |
1113 ASSERT_EQ(AreaSize(), static_cast<int>(size)); | 1110 ASSERT_EQ(AreaSize(), static_cast<int>(size)); |
1114 } else { | 1111 } else { |
1115 DecreaseUnsweptFreeBytes(page); | 1112 DecreaseUnsweptFreeBytes(page); |
1116 } | 1113 } |
1117 | 1114 |
| 1115 if (page->IsFlagSet(MemoryChunk::SCAN_ON_SCAVENGE)) { |
| 1116 heap()->decrement_scan_on_scavenge_pages(); |
| 1117 page->ClearFlag(MemoryChunk::SCAN_ON_SCAVENGE); |
| 1118 } |
| 1119 |
1118 ASSERT(!free_list_.ContainsPageFreeListItems(page)); | 1120 ASSERT(!free_list_.ContainsPageFreeListItems(page)); |
1119 | 1121 |
1120 if (Page::FromAllocationTop(allocation_info_.top()) == page) { | 1122 if (Page::FromAllocationTop(allocation_info_.top()) == page) { |
1121 allocation_info_.set_top(NULL); | 1123 allocation_info_.set_top(NULL); |
1122 allocation_info_.set_limit(NULL); | 1124 allocation_info_.set_limit(NULL); |
1123 } | 1125 } |
1124 | 1126 |
1125 if (unlink) { | 1127 page->Unlink(); |
1126 page->Unlink(); | |
1127 } | |
1128 if (page->IsFlagSet(MemoryChunk::CONTAINS_ONLY_DATA)) { | 1128 if (page->IsFlagSet(MemoryChunk::CONTAINS_ONLY_DATA)) { |
1129 heap()->isolate()->memory_allocator()->Free(page); | 1129 heap()->isolate()->memory_allocator()->Free(page); |
1130 } else { | 1130 } else { |
1131 heap()->QueueMemoryChunkForFree(page); | 1131 heap()->QueueMemoryChunkForFree(page); |
1132 } | 1132 } |
1133 | 1133 |
1134 ASSERT(Capacity() > 0); | 1134 ASSERT(Capacity() > 0); |
1135 accounting_stats_.ShrinkSpace(AreaSize()); | 1135 accounting_stats_.ShrinkSpace(AreaSize()); |
1136 } | 1136 } |
1137 | 1137 |
(...skipping 1971 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3109 object->ShortPrint(); | 3109 object->ShortPrint(); |
3110 PrintF("\n"); | 3110 PrintF("\n"); |
3111 } | 3111 } |
3112 printf(" --------------------------------------\n"); | 3112 printf(" --------------------------------------\n"); |
3113 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); | 3113 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); |
3114 } | 3114 } |
3115 | 3115 |
3116 #endif // DEBUG | 3116 #endif // DEBUG |
3117 | 3117 |
3118 } } // namespace v8::internal | 3118 } } // namespace v8::internal |
OLD | NEW |