@@ -54,6 +54,7 @@ bool SemiSpace::EnsureCurrentCapacity() { |
54 | 54 | // Free all overallocated pages which are behind current_page. |
55 | 55 | while (current_page) { |
56 | 56 | MemoryChunk* next_current = current_page->list_node().next(); |
| 57 | + AccountUncommitted(Page::kPageSize); |
57 | 58 | memory_chunk_list_.Remove(current_page); |
58 | 59 | // Clear new space flags to avoid this page being treated as a new |
59 | 60 | // space page that is potentially being swept. |
@@ -74,6 +75,7 @@ bool SemiSpace::EnsureCurrentCapacity() { |
74 | 75 | NOT_EXECUTABLE); |
75 | 76 | if (current_page == nullptr) return false; |
76 | 77 | DCHECK_NOT_NULL(current_page); |
| 78 | + AccountCommitted(Page::kPageSize); |
77 | 79 | memory_chunk_list_.PushBack(current_page); |
78 | 80 | marking_state->ClearLiveness(current_page); |
79 | 81 | current_page->SetFlags(first_page()->GetFlags(), |
@@ -106,6 +108,7 @@ void SemiSpace::TearDown() { |
106 | 108 |
|
107 | 109 | bool SemiSpace::Commit() { |
108 | 110 | DCHECK(!IsCommitted()); |
| 111 | + DCHECK_EQ(CommittedMemory(), size_t(0)); |
109 | 112 | const int num_pages = static_cast<int>(target_capacity_ / Page::kPageSize); |
110 | 113 | DCHECK(num_pages); |
111 | 114 | for (int pages_added = 0; pages_added < num_pages; pages_added++) { |
@@ -134,14 +137,19 @@ bool SemiSpace::Commit() { |
134 | 137 |
|
135 | 138 | bool SemiSpace::Uncommit() { |
136 | 139 | DCHECK(IsCommitted()); |
| 140 | + int actual_pages = 0; |
137 | 141 | while (!memory_chunk_list_.Empty()) { |
| 142 | + actual_pages++; |
138 | 143 | MemoryChunk* chunk = memory_chunk_list_.front(); |
139 | 144 | memory_chunk_list_.Remove(chunk); |
140 | 145 | heap()->memory_allocator()->Free<MemoryAllocator::kPooledAndQueue>(chunk); |
141 | 146 | } |
142 | 147 | current_page_ = nullptr; |
143 | 148 | current_capacity_ = 0; |
144 | | - AccountUncommitted(target_capacity_); |
| 149 | + size_t removed_page_size = |
| 150 | + static_cast<size_t>(actual_pages * Page::kPageSize); |
| 151 | + DCHECK_EQ(CommittedMemory(), removed_page_size); |
| 152 | + AccountUncommitted(removed_page_size); |
145 | 153 | heap()->memory_allocator()->unmapper()->FreeQueuedChunks(); |
146 | 154 | DCHECK(!IsCommitted()); |
147 | 155 | return true; |
@@ -246,6 +254,7 @@ void SemiSpace::RemovePage(Page* page) { |
246 | 254 | } |
247 | 255 | } |
248 | 256 | memory_chunk_list_.Remove(page); |
| 257 | + AccountUncommitted(Page::kPageSize); |
249 | 258 | for (size_t i = 0; i < ExternalBackingStoreType::kNumTypes; i++) { |
250 | 259 | ExternalBackingStoreType t = static_cast<ExternalBackingStoreType>(i); |
251 | 260 | DecrementExternalBackingStoreBytes(t, page->ExternalBackingStoreBytes(t)); |
@@ -258,6 +267,7 @@ void SemiSpace::PrependPage(Page* page) { |
258 | 267 | page->set_owner(this); |
259 | 268 | memory_chunk_list_.PushFront(page); |
260 | 269 | current_capacity_ += Page::kPageSize; |
| 270 | + AccountCommitted(Page::kPageSize); |
261 | 271 | for (size_t i = 0; i < ExternalBackingStoreType::kNumTypes; i++) { |
262 | 272 | ExternalBackingStoreType t = static_cast<ExternalBackingStoreType>(i); |
263 | 273 | IncrementExternalBackingStoreBytes(t, page->ExternalBackingStoreBytes(t)); |
@@ -319,6 +329,7 @@ void SemiSpace::Verify() { |
319 | 329 | external_backing_store_bytes[static_cast<ExternalBackingStoreType>(i)] = 0; |
320 | 330 | } |
321 | 331 |
|
| 332 | + int actual_pages = 0; |
322 | 333 | for (Page* page : *this) { |
323 | 334 | CHECK_EQ(page->owner(), this); |
324 | 335 | CHECK(page->InNewSpace()); |
@@ -344,7 +355,11 @@ void SemiSpace::Verify() { |
344 | 355 |
|
345 | 356 | CHECK_IMPLIES(page->list_node().prev(), |
346 | 357 | page->list_node().prev()->list_node().next() == page); |
| 358 | + |
| 359 | + actual_pages++; |
347 | 360 | } |
| 361 | + CHECK_EQ(actual_pages * size_t(Page::kPageSize), CommittedMemory()); |
| 362 | + |
348 | 363 | for (int i = 0; i < kNumTypes; i++) { |
349 | 364 | ExternalBackingStoreType t = static_cast<ExternalBackingStoreType>(i); |
350 | 365 | CHECK_EQ(external_backing_store_bytes[t], ExternalBackingStoreBytes(t)); |
|