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 963 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
974 if (Capacity() == max_capacity_) return false; | 974 if (Capacity() == max_capacity_) return false; |
975 | 975 |
976 ASSERT(Capacity() < max_capacity_); | 976 ASSERT(Capacity() < max_capacity_); |
977 | 977 |
978 // Are we going to exceed capacity for this space? | 978 // Are we going to exceed capacity for this space? |
979 if ((Capacity() + Page::kPageSize) > max_capacity_) return false; | 979 if ((Capacity() + Page::kPageSize) > max_capacity_) return false; |
980 | 980 |
981 return true; | 981 return true; |
982 } | 982 } |
983 | 983 |
| 984 |
984 bool PagedSpace::Expand() { | 985 bool PagedSpace::Expand() { |
985 if (!CanExpand()) return false; | 986 if (!CanExpand()) return false; |
986 | 987 |
987 intptr_t size = AreaSize(); | 988 intptr_t size = AreaSize(); |
988 | 989 |
989 if (anchor_.next_page() == &anchor_) { | 990 if (anchor_.next_page() == &anchor_) { |
990 size = SizeOfFirstPage(); | 991 size = SizeOfFirstPage(); |
991 } | 992 } |
992 | 993 |
993 Page* p = heap()->isolate()->memory_allocator()->AllocatePage( | 994 Page* p = heap()->isolate()->memory_allocator()->AllocatePage( |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1038 PageIterator it(this); | 1039 PageIterator it(this); |
1039 int count = 0; | 1040 int count = 0; |
1040 while (it.has_next()) { | 1041 while (it.has_next()) { |
1041 it.next(); | 1042 it.next(); |
1042 count++; | 1043 count++; |
1043 } | 1044 } |
1044 return count; | 1045 return count; |
1045 } | 1046 } |
1046 | 1047 |
1047 | 1048 |
1048 void PagedSpace::ReleasePage(Page* page) { | 1049 void PagedSpace::ReleasePage(Page* page, bool unlink) { |
1049 ASSERT(page->LiveBytes() == 0); | 1050 ASSERT(page->LiveBytes() == 0); |
1050 ASSERT(AreaSize() == page->area_size()); | 1051 ASSERT(AreaSize() == page->area_size()); |
1051 | 1052 |
1052 // Adjust list of unswept pages if the page is the head of the list. | 1053 // Adjust list of unswept pages if the page is the head of the list. |
1053 if (first_unswept_page_ == page) { | 1054 if (first_unswept_page_ == page) { |
1054 first_unswept_page_ = page->next_page(); | 1055 first_unswept_page_ = page->next_page(); |
1055 if (first_unswept_page_ == anchor()) { | 1056 if (first_unswept_page_ == anchor()) { |
1056 first_unswept_page_ = Page::FromAddress(NULL); | 1057 first_unswept_page_ = Page::FromAddress(NULL); |
1057 } | 1058 } |
1058 } | 1059 } |
1059 | 1060 |
1060 if (page->WasSwept()) { | 1061 if (page->WasSwept()) { |
1061 intptr_t size = free_list_.EvictFreeListItems(page); | 1062 intptr_t size = free_list_.EvictFreeListItems(page); |
1062 accounting_stats_.AllocateBytes(size); | 1063 accounting_stats_.AllocateBytes(size); |
1063 ASSERT_EQ(AreaSize(), static_cast<int>(size)); | 1064 ASSERT_EQ(AreaSize(), static_cast<int>(size)); |
1064 } else { | 1065 } else { |
1065 DecreaseUnsweptFreeBytes(page); | 1066 DecreaseUnsweptFreeBytes(page); |
1066 } | 1067 } |
1067 | 1068 |
1068 if (Page::FromAllocationTop(allocation_info_.top) == page) { | 1069 if (Page::FromAllocationTop(allocation_info_.top) == page) { |
1069 allocation_info_.top = allocation_info_.limit = NULL; | 1070 allocation_info_.top = allocation_info_.limit = NULL; |
1070 } | 1071 } |
1071 | 1072 |
1072 page->Unlink(); | 1073 if (unlink) { |
| 1074 page->Unlink(); |
| 1075 } |
1073 if (page->IsFlagSet(MemoryChunk::CONTAINS_ONLY_DATA)) { | 1076 if (page->IsFlagSet(MemoryChunk::CONTAINS_ONLY_DATA)) { |
1074 heap()->isolate()->memory_allocator()->Free(page); | 1077 heap()->isolate()->memory_allocator()->Free(page); |
1075 } else { | 1078 } else { |
1076 heap()->QueueMemoryChunkForFree(page); | 1079 heap()->QueueMemoryChunkForFree(page); |
1077 } | 1080 } |
1078 | 1081 |
1079 ASSERT(Capacity() > 0); | 1082 ASSERT(Capacity() > 0); |
1080 accounting_stats_.ShrinkSpace(AreaSize()); | 1083 accounting_stats_.ShrinkSpace(AreaSize()); |
1081 } | 1084 } |
1082 | 1085 |
(...skipping 1465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2548 } | 2551 } |
2549 | 2552 |
2550 | 2553 |
2551 bool PagedSpace::EnsureSweeperProgress(intptr_t size_in_bytes) { | 2554 bool PagedSpace::EnsureSweeperProgress(intptr_t size_in_bytes) { |
2552 MarkCompactCollector* collector = heap()->mark_compact_collector(); | 2555 MarkCompactCollector* collector = heap()->mark_compact_collector(); |
2553 if (collector->AreSweeperThreadsActivated()) { | 2556 if (collector->AreSweeperThreadsActivated()) { |
2554 if (collector->IsConcurrentSweepingInProgress()) { | 2557 if (collector->IsConcurrentSweepingInProgress()) { |
2555 if (collector->StealMemoryFromSweeperThreads(this) < size_in_bytes) { | 2558 if (collector->StealMemoryFromSweeperThreads(this) < size_in_bytes) { |
2556 if (!collector->sequential_sweeping()) { | 2559 if (!collector->sequential_sweeping()) { |
2557 collector->WaitUntilSweepingCompleted(); | 2560 collector->WaitUntilSweepingCompleted(); |
2558 collector->FinalizeSweeping(); | |
2559 return true; | 2561 return true; |
2560 } | 2562 } |
2561 } | 2563 } |
2562 return false; | 2564 return false; |
2563 } | 2565 } |
2564 return true; | 2566 return true; |
2565 } else { | 2567 } else { |
2566 return AdvanceSweeper(size_in_bytes); | 2568 return AdvanceSweeper(size_in_bytes); |
2567 } | 2569 } |
2568 } | 2570 } |
(...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3130 object->ShortPrint(); | 3132 object->ShortPrint(); |
3131 PrintF("\n"); | 3133 PrintF("\n"); |
3132 } | 3134 } |
3133 printf(" --------------------------------------\n"); | 3135 printf(" --------------------------------------\n"); |
3134 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); | 3136 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); |
3135 } | 3137 } |
3136 | 3138 |
3137 #endif // DEBUG | 3139 #endif // DEBUG |
3138 | 3140 |
3139 } } // namespace v8::internal | 3141 } } // namespace v8::internal |
OLD | NEW |