OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 850 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
861 } | 861 } |
862 | 862 |
863 | 863 |
864 void PagedSpace::TearDown() { | 864 void PagedSpace::TearDown() { |
865 Isolate::Current()->memory_allocator()->FreeAllPages(this); | 865 Isolate::Current()->memory_allocator()->FreeAllPages(this); |
866 first_page_ = NULL; | 866 first_page_ = NULL; |
867 accounting_stats_.Clear(); | 867 accounting_stats_.Clear(); |
868 } | 868 } |
869 | 869 |
870 | 870 |
871 #ifdef ENABLE_HEAP_PROTECTION | |
872 | |
873 void PagedSpace::Protect() { | |
874 Page* page = first_page_; | |
875 while (page->is_valid()) { | |
876 Isolate::Current()->memory_allocator()->ProtectChunkFromPage(page); | |
877 page = Isolate::Current()->memory_allocator()-> | |
878 FindLastPageInSameChunk(page)->next_page(); | |
879 } | |
880 } | |
881 | |
882 | |
883 void PagedSpace::Unprotect() { | |
884 Page* page = first_page_; | |
885 while (page->is_valid()) { | |
886 Isolate::Current()->memory_allocator()->UnprotectChunkFromPage(page); | |
887 page = Isolate::Current()->memory_allocator()-> | |
888 FindLastPageInSameChunk(page)->next_page(); | |
889 } | |
890 } | |
891 | |
892 #endif | |
893 | |
894 | |
895 void PagedSpace::MarkAllPagesClean() { | 871 void PagedSpace::MarkAllPagesClean() { |
896 PageIterator it(this, PageIterator::ALL_PAGES); | 872 PageIterator it(this, PageIterator::ALL_PAGES); |
897 while (it.has_next()) { | 873 while (it.has_next()) { |
898 it.next()->SetRegionMarks(Page::kAllRegionsCleanMarks); | 874 it.next()->SetRegionMarks(Page::kAllRegionsCleanMarks); |
899 } | 875 } |
900 } | 876 } |
901 | 877 |
902 | 878 |
903 MaybeObject* PagedSpace::FindObject(Address addr) { | 879 MaybeObject* PagedSpace::FindObject(Address addr) { |
904 // Note: this function can only be called before or after mark-compact GC | 880 // Note: this function can only be called before or after mark-compact GC |
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1251 allocation_info_.top = NULL; | 1227 allocation_info_.top = NULL; |
1252 allocation_info_.limit = NULL; | 1228 allocation_info_.limit = NULL; |
1253 mc_forwarding_info_.top = NULL; | 1229 mc_forwarding_info_.top = NULL; |
1254 mc_forwarding_info_.limit = NULL; | 1230 mc_forwarding_info_.limit = NULL; |
1255 | 1231 |
1256 to_space_.TearDown(); | 1232 to_space_.TearDown(); |
1257 from_space_.TearDown(); | 1233 from_space_.TearDown(); |
1258 } | 1234 } |
1259 | 1235 |
1260 | 1236 |
1261 #ifdef ENABLE_HEAP_PROTECTION | |
1262 | |
1263 void NewSpace::Protect() { | |
1264 heap()->isolate()->memory_allocator()->Protect(ToSpaceLow(), Capacity()); | |
1265 heap()->isolate()->memory_allocator()->Protect(FromSpaceLow(), Capacity()); | |
1266 } | |
1267 | |
1268 | |
1269 void NewSpace::Unprotect() { | |
1270 heap()->isolate()->memory_allocator()->Unprotect(ToSpaceLow(), Capacity(), | |
1271 to_space_.executable()); | |
1272 heap()->isolate()->memory_allocator()->Unprotect(FromSpaceLow(), Capacity(), | |
1273 from_space_.executable()); | |
1274 } | |
1275 | |
1276 #endif | |
1277 | |
1278 | |
1279 void NewSpace::Flip() { | 1237 void NewSpace::Flip() { |
1280 SemiSpace tmp = from_space_; | 1238 SemiSpace tmp = from_space_; |
1281 from_space_ = to_space_; | 1239 from_space_ = to_space_; |
1282 to_space_ = tmp; | 1240 to_space_ = tmp; |
1283 } | 1241 } |
1284 | 1242 |
1285 | 1243 |
1286 void NewSpace::Grow() { | 1244 void NewSpace::Grow() { |
1287 ASSERT(Capacity() < MaximumCapacity()); | 1245 ASSERT(Capacity() < MaximumCapacity()); |
1288 if (to_space_.Grow()) { | 1246 if (to_space_.Grow()) { |
(...skipping 1513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2802 heap()->isolate()->memory_allocator()->PerformAllocationCallback( | 2760 heap()->isolate()->memory_allocator()->PerformAllocationCallback( |
2803 space, kAllocationActionFree, size); | 2761 space, kAllocationActionFree, size); |
2804 } | 2762 } |
2805 | 2763 |
2806 size_ = 0; | 2764 size_ = 0; |
2807 page_count_ = 0; | 2765 page_count_ = 0; |
2808 objects_size_ = 0; | 2766 objects_size_ = 0; |
2809 } | 2767 } |
2810 | 2768 |
2811 | 2769 |
2812 #ifdef ENABLE_HEAP_PROTECTION | |
2813 | |
2814 void LargeObjectSpace::Protect() { | |
2815 LargeObjectChunk* chunk = first_chunk_; | |
2816 while (chunk != NULL) { | |
2817 heap()->isolate()->memory_allocator()->Protect(chunk->address(), | |
2818 chunk->size()); | |
2819 chunk = chunk->next(); | |
2820 } | |
2821 } | |
2822 | |
2823 | |
2824 void LargeObjectSpace::Unprotect() { | |
2825 LargeObjectChunk* chunk = first_chunk_; | |
2826 while (chunk != NULL) { | |
2827 bool is_code = chunk->GetObject()->IsCode(); | |
2828 heap()->isolate()->memory_allocator()->Unprotect(chunk->address(), | |
2829 chunk->size(), is_code ? EXECUTABLE : NOT_EXECUTABLE); | |
2830 chunk = chunk->next(); | |
2831 } | |
2832 } | |
2833 | |
2834 #endif | |
2835 | |
2836 | |
2837 MaybeObject* LargeObjectSpace::AllocateRawInternal(int requested_size, | 2770 MaybeObject* LargeObjectSpace::AllocateRawInternal(int requested_size, |
2838 int object_size, | 2771 int object_size, |
2839 Executability executable) { | 2772 Executability executable) { |
2840 ASSERT(0 < object_size && object_size <= requested_size); | 2773 ASSERT(0 < object_size && object_size <= requested_size); |
2841 | 2774 |
2842 // Check if we want to force a GC before growing the old space further. | 2775 // Check if we want to force a GC before growing the old space further. |
2843 // If so, fail the allocation. | 2776 // If so, fail the allocation. |
2844 if (!heap()->always_allocate() && | 2777 if (!heap()->always_allocate() && |
2845 heap()->OldGenerationAllocationLimitReached()) { | 2778 heap()->OldGenerationAllocationLimitReached()) { |
2846 return Failure::RetryAfterGC(identity()); | 2779 return Failure::RetryAfterGC(identity()); |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3136 for (HeapObject* obj = obj_it.next(); obj != NULL; obj = obj_it.next()) { | 3069 for (HeapObject* obj = obj_it.next(); obj != NULL; obj = obj_it.next()) { |
3137 if (obj->IsCode()) { | 3070 if (obj->IsCode()) { |
3138 Code* code = Code::cast(obj); | 3071 Code* code = Code::cast(obj); |
3139 isolate->code_kind_statistics()[code->kind()] += code->Size(); | 3072 isolate->code_kind_statistics()[code->kind()] += code->Size(); |
3140 } | 3073 } |
3141 } | 3074 } |
3142 } | 3075 } |
3143 #endif // DEBUG | 3076 #endif // DEBUG |
3144 | 3077 |
3145 } } // namespace v8::internal | 3078 } } // namespace v8::internal |
OLD | NEW |