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_SPACES_INL_H_ | 5 #ifndef V8_HEAP_SPACES_INL_H_ |
6 #define V8_SPACES_INL_H_ | 6 #define V8_HEAP_SPACES_INL_H_ |
7 | 7 |
| 8 #include "src/heap/spaces.h" |
8 #include "src/heap-profiler.h" | 9 #include "src/heap-profiler.h" |
9 #include "src/isolate.h" | 10 #include "src/isolate.h" |
10 #include "src/spaces.h" | |
11 #include "src/v8memory.h" | 11 #include "src/v8memory.h" |
12 | 12 |
13 namespace v8 { | 13 namespace v8 { |
14 namespace internal { | 14 namespace internal { |
15 | 15 |
16 | 16 |
17 // ----------------------------------------------------------------------------- | 17 // ----------------------------------------------------------------------------- |
18 // Bitmap | 18 // Bitmap |
19 | 19 |
20 void Bitmap::Clear(MemoryChunk* chunk) { | 20 void Bitmap::Clear(MemoryChunk* chunk) { |
21 Bitmap* bitmap = chunk->markbits(); | 21 Bitmap* bitmap = chunk->markbits(); |
22 for (int i = 0; i < bitmap->CellsCount(); i++) bitmap->cells()[i] = 0; | 22 for (int i = 0; i < bitmap->CellsCount(); i++) bitmap->cells()[i] = 0; |
23 chunk->ResetLiveBytes(); | 23 chunk->ResetLiveBytes(); |
24 } | 24 } |
25 | 25 |
26 | 26 |
27 // ----------------------------------------------------------------------------- | 27 // ----------------------------------------------------------------------------- |
28 // PageIterator | 28 // PageIterator |
29 | 29 |
30 | 30 |
31 PageIterator::PageIterator(PagedSpace* space) | 31 PageIterator::PageIterator(PagedSpace* space) |
32 : space_(space), | 32 : space_(space), |
33 prev_page_(&space->anchor_), | 33 prev_page_(&space->anchor_), |
34 next_page_(prev_page_->next_page()) { } | 34 next_page_(prev_page_->next_page()) {} |
35 | 35 |
36 | 36 |
37 bool PageIterator::has_next() { | 37 bool PageIterator::has_next() { return next_page_ != &space_->anchor_; } |
38 return next_page_ != &space_->anchor_; | |
39 } | |
40 | 38 |
41 | 39 |
42 Page* PageIterator::next() { | 40 Page* PageIterator::next() { |
43 DCHECK(has_next()); | 41 DCHECK(has_next()); |
44 prev_page_ = next_page_; | 42 prev_page_ = next_page_; |
45 next_page_ = next_page_->next_page(); | 43 next_page_ = next_page_->next_page(); |
46 return prev_page_; | 44 return prev_page_; |
47 } | 45 } |
48 | 46 |
49 | 47 |
50 // ----------------------------------------------------------------------------- | 48 // ----------------------------------------------------------------------------- |
51 // NewSpacePageIterator | 49 // NewSpacePageIterator |
52 | 50 |
53 | 51 |
54 NewSpacePageIterator::NewSpacePageIterator(NewSpace* space) | 52 NewSpacePageIterator::NewSpacePageIterator(NewSpace* space) |
55 : prev_page_(NewSpacePage::FromAddress(space->ToSpaceStart())->prev_page()), | 53 : prev_page_(NewSpacePage::FromAddress(space->ToSpaceStart())->prev_page()), |
56 next_page_(NewSpacePage::FromAddress(space->ToSpaceStart())), | 54 next_page_(NewSpacePage::FromAddress(space->ToSpaceStart())), |
57 last_page_(NewSpacePage::FromLimit(space->ToSpaceEnd())) { } | 55 last_page_(NewSpacePage::FromLimit(space->ToSpaceEnd())) {} |
58 | 56 |
59 NewSpacePageIterator::NewSpacePageIterator(SemiSpace* space) | 57 NewSpacePageIterator::NewSpacePageIterator(SemiSpace* space) |
60 : prev_page_(space->anchor()), | 58 : prev_page_(space->anchor()), |
61 next_page_(prev_page_->next_page()), | 59 next_page_(prev_page_->next_page()), |
62 last_page_(prev_page_->prev_page()) { } | 60 last_page_(prev_page_->prev_page()) {} |
63 | 61 |
64 NewSpacePageIterator::NewSpacePageIterator(Address start, Address limit) | 62 NewSpacePageIterator::NewSpacePageIterator(Address start, Address limit) |
65 : prev_page_(NewSpacePage::FromAddress(start)->prev_page()), | 63 : prev_page_(NewSpacePage::FromAddress(start)->prev_page()), |
66 next_page_(NewSpacePage::FromAddress(start)), | 64 next_page_(NewSpacePage::FromAddress(start)), |
67 last_page_(NewSpacePage::FromLimit(limit)) { | 65 last_page_(NewSpacePage::FromLimit(limit)) { |
68 SemiSpace::AssertValidRange(start, limit); | 66 SemiSpace::AssertValidRange(start, limit); |
69 } | 67 } |
70 | 68 |
71 | 69 |
72 bool NewSpacePageIterator::has_next() { | 70 bool NewSpacePageIterator::has_next() { return prev_page_ != last_page_; } |
73 return prev_page_ != last_page_; | |
74 } | |
75 | 71 |
76 | 72 |
77 NewSpacePage* NewSpacePageIterator::next() { | 73 NewSpacePage* NewSpacePageIterator::next() { |
78 DCHECK(has_next()); | 74 DCHECK(has_next()); |
79 prev_page_ = next_page_; | 75 prev_page_ = next_page_; |
80 next_page_ = next_page_->next_page(); | 76 next_page_ = next_page_->next_page(); |
81 return prev_page_; | 77 return prev_page_; |
82 } | 78 } |
83 | 79 |
84 | 80 |
(...skipping 21 matching lines...) Expand all Loading... |
106 // ----------------------------------------------------------------------------- | 102 // ----------------------------------------------------------------------------- |
107 // MemoryAllocator | 103 // MemoryAllocator |
108 | 104 |
109 #ifdef ENABLE_HEAP_PROTECTION | 105 #ifdef ENABLE_HEAP_PROTECTION |
110 | 106 |
111 void MemoryAllocator::Protect(Address start, size_t size) { | 107 void MemoryAllocator::Protect(Address start, size_t size) { |
112 base::OS::Protect(start, size); | 108 base::OS::Protect(start, size); |
113 } | 109 } |
114 | 110 |
115 | 111 |
116 void MemoryAllocator::Unprotect(Address start, | 112 void MemoryAllocator::Unprotect(Address start, size_t size, |
117 size_t size, | |
118 Executability executable) { | 113 Executability executable) { |
119 base::OS::Unprotect(start, size, executable); | 114 base::OS::Unprotect(start, size, executable); |
120 } | 115 } |
121 | 116 |
122 | 117 |
123 void MemoryAllocator::ProtectChunkFromPage(Page* page) { | 118 void MemoryAllocator::ProtectChunkFromPage(Page* page) { |
124 int id = GetChunkId(page); | 119 int id = GetChunkId(page); |
125 base::OS::Protect(chunks_[id].address(), chunks_[id].size()); | 120 base::OS::Protect(chunks_[id].address(), chunks_[id].size()); |
126 } | 121 } |
127 | 122 |
128 | 123 |
129 void MemoryAllocator::UnprotectChunkFromPage(Page* page) { | 124 void MemoryAllocator::UnprotectChunkFromPage(Page* page) { |
130 int id = GetChunkId(page); | 125 int id = GetChunkId(page); |
131 base::OS::Unprotect(chunks_[id].address(), chunks_[id].size(), | 126 base::OS::Unprotect(chunks_[id].address(), chunks_[id].size(), |
132 chunks_[id].owner()->executable() == EXECUTABLE); | 127 chunks_[id].owner()->executable() == EXECUTABLE); |
133 } | 128 } |
134 | 129 |
135 #endif | 130 #endif |
136 | 131 |
137 | 132 |
138 // -------------------------------------------------------------------------- | 133 // -------------------------------------------------------------------------- |
139 // PagedSpace | 134 // PagedSpace |
140 Page* Page::Initialize(Heap* heap, | 135 Page* Page::Initialize(Heap* heap, MemoryChunk* chunk, Executability executable, |
141 MemoryChunk* chunk, | |
142 Executability executable, | |
143 PagedSpace* owner) { | 136 PagedSpace* owner) { |
144 Page* page = reinterpret_cast<Page*>(chunk); | 137 Page* page = reinterpret_cast<Page*>(chunk); |
145 DCHECK(page->area_size() <= kMaxRegularHeapObjectSize); | 138 DCHECK(page->area_size() <= kMaxRegularHeapObjectSize); |
146 DCHECK(chunk->owner() == owner); | 139 DCHECK(chunk->owner() == owner); |
147 owner->IncreaseCapacity(page->area_size()); | 140 owner->IncreaseCapacity(page->area_size()); |
148 owner->Free(page->area_start(), page->area_size()); | 141 owner->Free(page->area_start(), page->area_size()); |
149 | 142 |
150 heap->incremental_marking()->SetOldSpacePageFlags(chunk); | 143 heap->incremental_marking()->SetOldSpacePageFlags(chunk); |
151 | 144 |
152 return page; | 145 return page; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 if (new_mark > chunk->high_water_mark_) { | 195 if (new_mark > chunk->high_water_mark_) { |
203 chunk->high_water_mark_ = new_mark; | 196 chunk->high_water_mark_ = new_mark; |
204 } | 197 } |
205 } | 198 } |
206 | 199 |
207 | 200 |
208 PointerChunkIterator::PointerChunkIterator(Heap* heap) | 201 PointerChunkIterator::PointerChunkIterator(Heap* heap) |
209 : state_(kOldPointerState), | 202 : state_(kOldPointerState), |
210 old_pointer_iterator_(heap->old_pointer_space()), | 203 old_pointer_iterator_(heap->old_pointer_space()), |
211 map_iterator_(heap->map_space()), | 204 map_iterator_(heap->map_space()), |
212 lo_iterator_(heap->lo_space()) { } | 205 lo_iterator_(heap->lo_space()) {} |
213 | 206 |
214 | 207 |
215 Page* Page::next_page() { | 208 Page* Page::next_page() { |
216 DCHECK(next_chunk()->owner() == owner()); | 209 DCHECK(next_chunk()->owner() == owner()); |
217 return static_cast<Page*>(next_chunk()); | 210 return static_cast<Page*>(next_chunk()); |
218 } | 211 } |
219 | 212 |
220 | 213 |
221 Page* Page::prev_page() { | 214 Page* Page::prev_page() { |
222 DCHECK(prev_chunk()->owner() == owner()); | 215 DCHECK(prev_chunk()->owner() == owner()); |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 | 291 |
299 | 292 |
300 intptr_t LargeObjectSpace::Available() { | 293 intptr_t LargeObjectSpace::Available() { |
301 return ObjectSizeFor(heap()->isolate()->memory_allocator()->Available()); | 294 return ObjectSizeFor(heap()->isolate()->memory_allocator()->Available()); |
302 } | 295 } |
303 | 296 |
304 | 297 |
305 bool FreeListNode::IsFreeListNode(HeapObject* object) { | 298 bool FreeListNode::IsFreeListNode(HeapObject* object) { |
306 Map* map = object->map(); | 299 Map* map = object->map(); |
307 Heap* heap = object->GetHeap(); | 300 Heap* heap = object->GetHeap(); |
308 return map == heap->raw_unchecked_free_space_map() | 301 return map == heap->raw_unchecked_free_space_map() || |
309 || map == heap->raw_unchecked_one_pointer_filler_map() | 302 map == heap->raw_unchecked_one_pointer_filler_map() || |
310 || map == heap->raw_unchecked_two_pointer_filler_map(); | 303 map == heap->raw_unchecked_two_pointer_filler_map(); |
311 } | 304 } |
| 305 } |
| 306 } // namespace v8::internal |
312 | 307 |
313 } } // namespace v8::internal | 308 #endif // V8_HEAP_SPACES_INL_H_ |
314 | |
315 #endif // V8_SPACES_INL_H_ | |
OLD | NEW |