Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1159)

Side by Side Diff: runtime/vm/pages.cc

Issue 10696029: Implement a 2-pass heap verification algorithm. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: rebase Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/pages.h ('k') | runtime/vm/scavenger.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/pages.h" 5 #include "vm/pages.h"
6 6
7 #include "platform/assert.h" 7 #include "platform/assert.h"
8 #include "vm/gc_marker.h" 8 #include "vm/gc_marker.h"
9 #include "vm/gc_sweeper.h" 9 #include "vm/gc_sweeper.h"
10 #include "vm/object.h" 10 #include "vm/object.h"
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 while (page != NULL) { 259 while (page != NULL) {
260 if (page->Contains(addr)) { 260 if (page->Contains(addr)) {
261 return true; 261 return true;
262 } 262 }
263 page = page->next(); 263 page = page->next();
264 } 264 }
265 return false; 265 return false;
266 } 266 }
267 267
268 268
269 void PageSpace::StartEndAddress(uword* start, uword* end) const {
270 ASSERT(pages_ != NULL || large_pages_ != NULL);
271 *start = static_cast<uword>(~0);
272 *end = 0;
273 for (HeapPage* page = pages_; page != NULL; page = page->next()) {
274 *start = Utils::Minimum(*start, page->start());
275 *end = Utils::Maximum(*end, page->end());
276 }
277 for (HeapPage* page = large_pages_; page != NULL; page = page->next()) {
278 *start = Utils::Minimum(*start, page->start());
279 *end = Utils::Maximum(*end, page->end());
280 }
281 ASSERT(*start != static_cast<uword>(~0));
282 ASSERT(*end != 0);
283 }
284
285
269 void PageSpace::VisitObjects(ObjectVisitor* visitor) const { 286 void PageSpace::VisitObjects(ObjectVisitor* visitor) const {
270 HeapPage* page = pages_; 287 HeapPage* page = pages_;
271 while (page != NULL) { 288 while (page != NULL) {
272 page->VisitObjects(visitor); 289 page->VisitObjects(visitor);
273 page = page->next(); 290 page = page->next();
274 } 291 }
275 292
276 page = large_pages_; 293 page = large_pages_;
277 while (page != NULL) { 294 while (page != NULL) {
278 page->VisitObjects(visitor); 295 page->VisitObjects(visitor);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 337
321 338
322 void PageSpace::MarkSweep(bool invoke_api_callbacks) { 339 void PageSpace::MarkSweep(bool invoke_api_callbacks) {
323 // MarkSweep is not reentrant. Make sure that is the case. 340 // MarkSweep is not reentrant. Make sure that is the case.
324 ASSERT(!sweeping_); 341 ASSERT(!sweeping_);
325 sweeping_ = true; 342 sweeping_ = true;
326 Isolate* isolate = Isolate::Current(); 343 Isolate* isolate = Isolate::Current();
327 NoHandleScope no_handles(isolate); 344 NoHandleScope no_handles(isolate);
328 345
329 if (FLAG_verify_before_gc) { 346 if (FLAG_verify_before_gc) {
330 OS::PrintErr("Verifying before MarkSweep... "); 347 OS::PrintErr("Verifying before MarkSweep...");
331 heap_->Verify(); 348 heap_->Verify();
332 OS::PrintErr(" done.\n"); 349 OS::PrintErr(" done.\n");
333 } 350 }
334 351
335 Timer timer(true, "MarkSweep"); 352 Timer timer(true, "MarkSweep");
336 timer.Start(); 353 timer.Start();
337 int64_t start = OS::GetCurrentTimeMillis(); 354 int64_t start = OS::GetCurrentTimeMillis();
338 355
339 // Mark all reachable old-gen objects. 356 // Mark all reachable old-gen objects.
340 GCMarker marker(heap_); 357 GCMarker marker(heap_);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 const intptr_t KB2 = KB / 2; 409 const intptr_t KB2 = KB / 2;
393 OS::PrintErr("Mark-Sweep[%d]: %lldus (%dK -> %dK, %dK)\n", 410 OS::PrintErr("Mark-Sweep[%d]: %lldus (%dK -> %dK, %dK)\n",
394 count_, 411 count_,
395 timer.TotalElapsedTime(), 412 timer.TotalElapsedTime(),
396 (in_use_before + (KB2)) / KB, 413 (in_use_before + (KB2)) / KB,
397 (in_use + (KB2)) / KB, 414 (in_use + (KB2)) / KB,
398 (capacity_ + KB2) / KB); 415 (capacity_ + KB2) / KB);
399 } 416 }
400 417
401 if (FLAG_verify_after_gc) { 418 if (FLAG_verify_after_gc) {
402 OS::PrintErr("Verifying after MarkSweep... "); 419 OS::PrintErr("Verifying after MarkSweep...");
403 heap_->Verify(); 420 heap_->Verify();
404 OS::PrintErr(" done.\n"); 421 OS::PrintErr(" done.\n");
405 } 422 }
406 423
407 count_++; 424 count_++;
408 // Done, reset the marker. 425 // Done, reset the marker.
409 ASSERT(sweeping_); 426 ASSERT(sweeping_);
410 sweeping_ = false; 427 sweeping_ = false;
411 } 428 }
412 429
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
518 return 0; 535 return 0;
519 } else { 536 } else {
520 ASSERT(total_time >= gc_time); 537 ASSERT(total_time >= gc_time);
521 int result= static_cast<int>((static_cast<double>(gc_time) / 538 int result= static_cast<int>((static_cast<double>(gc_time) /
522 static_cast<double>(total_time)) * 100); 539 static_cast<double>(total_time)) * 100);
523 return result; 540 return result;
524 } 541 }
525 } 542 }
526 543
527 } // namespace dart 544 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/pages.h ('k') | runtime/vm/scavenger.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698