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

Side by Side Diff: src/heap.cc

Issue 6542047: Basic implementation of incremental marking. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/gc
Patch Set: Created 9 years, 10 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
OLDNEW
1 // Copyright 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 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 16 matching lines...) Expand all
27 27
28 #include "v8.h" 28 #include "v8.h"
29 29
30 #include "accessors.h" 30 #include "accessors.h"
31 #include "api.h" 31 #include "api.h"
32 #include "bootstrapper.h" 32 #include "bootstrapper.h"
33 #include "codegen-inl.h" 33 #include "codegen-inl.h"
34 #include "compilation-cache.h" 34 #include "compilation-cache.h"
35 #include "debug.h" 35 #include "debug.h"
36 #include "heap-profiler.h" 36 #include "heap-profiler.h"
37 #include "incremental-marking.h"
37 #include "global-handles.h" 38 #include "global-handles.h"
38 #include "liveobjectlist-inl.h" 39 #include "liveobjectlist-inl.h"
39 #include "mark-compact.h" 40 #include "mark-compact.h"
40 #include "natives.h" 41 #include "natives.h"
41 #include "objects-visiting.h" 42 #include "objects-visiting.h"
42 #include "runtime-profiler.h" 43 #include "runtime-profiler.h"
43 #include "scanner-base.h" 44 #include "scanner-base.h"
44 #include "scopeinfo.h" 45 #include "scopeinfo.h"
45 #include "snapshot.h" 46 #include "snapshot.h"
46 #include "store-buffer.h" 47 #include "store-buffer.h"
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 463
463 #ifdef DEBUG 464 #ifdef DEBUG
464 // Reset the allocation timeout to the GC interval, but make sure to 465 // Reset the allocation timeout to the GC interval, but make sure to
465 // allow at least a few allocations after a collection. The reason 466 // allow at least a few allocations after a collection. The reason
466 // for this is that we have a lot of allocation sequences and we 467 // for this is that we have a lot of allocation sequences and we
467 // assume that a garbage collection will allow the subsequent 468 // assume that a garbage collection will allow the subsequent
468 // allocation attempts to go through. 469 // allocation attempts to go through.
469 allocation_timeout_ = Max(6, FLAG_gc_interval); 470 allocation_timeout_ = Max(6, FLAG_gc_interval);
470 #endif 471 #endif
471 472
473 if (collector == SCAVENGER &&
474 IncrementalMarking::state() != IncrementalMarking::STOPPED) {
475 if (FLAG_trace_incremental_marking) {
476 PrintF("[IncremenalMarker] SCAVENGE -> MARK-SWEEEP\n");
Erik Corry 2011/02/22 12:27:19 menal -> mental SWEEEP -> SWEEP
Vyacheslav Egorov (Chromium) 2011/02/23 14:31:46 Done.
477 }
478 collector = MARK_COMPACTOR;
479 }
480
472 bool next_gc_likely_to_collect_more = false; 481 bool next_gc_likely_to_collect_more = false;
473 482
474 { GCTracer tracer; 483 { GCTracer tracer;
475 GarbageCollectionPrologue(); 484 GarbageCollectionPrologue();
476 // The GC count was incremented in the prologue. Tell the tracer about 485 // The GC count was incremented in the prologue. Tell the tracer about
477 // it. 486 // it.
478 tracer.set_gc_count(gc_count_); 487 tracer.set_gc_count(gc_count_);
479 488
480 // Tell the tracer which collector we've selected. 489 // Tell the tracer which collector we've selected.
481 tracer.set_collector(collector); 490 tracer.set_collector(collector);
482 491
483 HistogramTimer* rate = (collector == SCAVENGER) 492 HistogramTimer* rate = (collector == SCAVENGER)
484 ? &Counters::gc_scavenger 493 ? &Counters::gc_scavenger
485 : &Counters::gc_compactor; 494 : &Counters::gc_compactor;
486 rate->Start(); 495 rate->Start();
487 next_gc_likely_to_collect_more = 496 next_gc_likely_to_collect_more =
488 PerformGarbageCollection(collector, &tracer); 497 PerformGarbageCollection(collector, &tracer);
489 rate->Stop(); 498 rate->Stop();
490 499
491 GarbageCollectionEpilogue(); 500 GarbageCollectionEpilogue();
492 } 501 }
493 502
503 ASSERT(IncrementalMarking::state() == IncrementalMarking::STOPPED);
504 if (NextGCIsLikelyToBeFull() && FLAG_incremental_marking) {
505 IncrementalMarking::Start();
506 }
494 507
495 #ifdef ENABLE_LOGGING_AND_PROFILING 508 #ifdef ENABLE_LOGGING_AND_PROFILING
496 if (FLAG_log_gc) HeapProfiler::WriteSample(); 509 if (FLAG_log_gc) HeapProfiler::WriteSample();
497 if (CpuProfiler::is_profiling()) CpuProfiler::ProcessMovedFunctions(); 510 if (CpuProfiler::is_profiling()) CpuProfiler::ProcessMovedFunctions();
498 #endif 511 #endif
499 512
500 return next_gc_likely_to_collect_more; 513 return next_gc_likely_to_collect_more;
501 } 514 }
502 515
503 516
504 void Heap::PerformScavenge() { 517 void Heap::PerformScavenge() {
505 GCTracer tracer; 518 GCTracer tracer;
506 PerformGarbageCollection(SCAVENGER, &tracer); 519 if (IncrementalMarking::state() == IncrementalMarking::STOPPED) {
520 PerformGarbageCollection(SCAVENGER, &tracer);
521 } else {
522 PerformGarbageCollection(MARK_COMPACTOR, &tracer);
523 }
507 } 524 }
508 525
509 526
510 #ifdef DEBUG 527 #ifdef DEBUG
511 // Helper class for verifying the symbol table. 528 // Helper class for verifying the symbol table.
512 class SymbolTableVerifier : public ObjectVisitor { 529 class SymbolTableVerifier : public ObjectVisitor {
513 public: 530 public:
514 SymbolTableVerifier() { } 531 SymbolTableVerifier() { }
515 void VisitPointers(Object** start, Object** end) { 532 void VisitPointers(Object** start, Object** end) {
516 // Visit all HeapObject pointers in [start, end). 533 // Visit all HeapObject pointers in [start, end).
(...skipping 5050 matching lines...) Expand 10 before | Expand all | Expand 10 after
5567 void ExternalStringTable::TearDown() { 5584 void ExternalStringTable::TearDown() {
5568 new_space_strings_.Free(); 5585 new_space_strings_.Free();
5569 old_space_strings_.Free(); 5586 old_space_strings_.Free();
5570 } 5587 }
5571 5588
5572 5589
5573 List<Object*> ExternalStringTable::new_space_strings_; 5590 List<Object*> ExternalStringTable::new_space_strings_;
5574 List<Object*> ExternalStringTable::old_space_strings_; 5591 List<Object*> ExternalStringTable::old_space_strings_;
5575 5592
5576 } } // namespace v8::internal 5593 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698