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

Side by Side Diff: src/heap/heap.cc

Issue 2548213004: [heap] Use callbacks to dispatch store buffer operations. (Closed)
Patch Set: restructure Created 4 years 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
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 #include "src/heap/heap.h" 5 #include "src/heap/heap.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api.h" 8 #include "src/api.h"
9 #include "src/ast/context-slot-cache.h" 9 #include "src/ast/context-slot-cache.h"
10 #include "src/base/bits.h" 10 #include "src/base/bits.h"
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 ->Increment(); 279 ->Increment();
280 *reason = "scavenge might not succeed"; 280 *reason = "scavenge might not succeed";
281 return MARK_COMPACTOR; 281 return MARK_COMPACTOR;
282 } 282 }
283 283
284 // Default 284 // Default
285 *reason = NULL; 285 *reason = NULL;
286 return YoungGenerationCollector(); 286 return YoungGenerationCollector();
287 } 287 }
288 288
289 void Heap::SetGCState(HeapState state) {
290 gc_state_ = state;
291 store_buffer_->SetMode(gc_state_);
292 }
289 293
290 // TODO(1238405): Combine the infrastructure for --heap-stats and 294 // TODO(1238405): Combine the infrastructure for --heap-stats and
291 // --log-gc to avoid the complicated preprocessor and flag testing. 295 // --log-gc to avoid the complicated preprocessor and flag testing.
292 void Heap::ReportStatisticsBeforeGC() { 296 void Heap::ReportStatisticsBeforeGC() {
293 // Heap::ReportHeapStatistics will also log NewSpace statistics when 297 // Heap::ReportHeapStatistics will also log NewSpace statistics when
294 // compiled --log-gc is set. The following logic is used to avoid 298 // compiled --log-gc is set. The following logic is used to avoid
295 // double logging. 299 // double logging.
296 #ifdef DEBUG 300 #ifdef DEBUG
297 if (FLAG_heap_stats || FLAG_log_gc) new_space_->CollectStatistics(); 301 if (FLAG_heap_stats || FLAG_log_gc) new_space_->CollectStatistics();
298 if (FLAG_heap_stats) { 302 if (FLAG_heap_stats) {
(...skipping 1123 matching lines...) Expand 10 before | Expand all | Expand 10 after
1422 gc_epilogue_callbacks_[i].callback(isolate, gc_type, gc_callback_flags); 1426 gc_epilogue_callbacks_[i].callback(isolate, gc_type, gc_callback_flags);
1423 } 1427 }
1424 } 1428 }
1425 } 1429 }
1426 } 1430 }
1427 1431
1428 1432
1429 void Heap::MarkCompact() { 1433 void Heap::MarkCompact() {
1430 PauseAllocationObserversScope pause_observers(this); 1434 PauseAllocationObserversScope pause_observers(this);
1431 1435
1432 gc_state_ = MARK_COMPACT; 1436 SetGCState(MARK_COMPACT);
1437
1433 LOG(isolate_, ResourceEvent("markcompact", "begin")); 1438 LOG(isolate_, ResourceEvent("markcompact", "begin"));
1434 1439
1435 uint64_t size_of_objects_before_gc = SizeOfObjects(); 1440 uint64_t size_of_objects_before_gc = SizeOfObjects();
1436 1441
1437 mark_compact_collector()->Prepare(); 1442 mark_compact_collector()->Prepare();
1438 1443
1439 ms_count_++; 1444 ms_count_++;
1440 1445
1441 MarkCompactPrologue(); 1446 MarkCompactPrologue();
1442 1447
1443 mark_compact_collector()->CollectGarbage(); 1448 mark_compact_collector()->CollectGarbage();
1444 1449
1445 LOG(isolate_, ResourceEvent("markcompact", "end")); 1450 LOG(isolate_, ResourceEvent("markcompact", "end"));
1446 1451
1447 MarkCompactEpilogue(); 1452 MarkCompactEpilogue();
1448 1453
1449 if (FLAG_allocation_site_pretenuring) { 1454 if (FLAG_allocation_site_pretenuring) {
1450 EvaluateOldSpaceLocalPretenuring(size_of_objects_before_gc); 1455 EvaluateOldSpaceLocalPretenuring(size_of_objects_before_gc);
1451 } 1456 }
1452 } 1457 }
1453 1458
1454 void Heap::MinorMarkCompact() { UNREACHABLE(); } 1459 void Heap::MinorMarkCompact() { UNREACHABLE(); }
1455 1460
1456 void Heap::MarkCompactEpilogue() { 1461 void Heap::MarkCompactEpilogue() {
1457 TRACE_GC(tracer(), GCTracer::Scope::MC_EPILOGUE); 1462 TRACE_GC(tracer(), GCTracer::Scope::MC_EPILOGUE);
1458 gc_state_ = NOT_IN_GC; 1463 SetGCState(NOT_IN_GC);
1459 1464
1460 isolate_->counters()->objs_since_last_full()->Set(0); 1465 isolate_->counters()->objs_since_last_full()->Set(0);
1461 1466
1462 incremental_marking()->Epilogue(); 1467 incremental_marking()->Epilogue();
1463 1468
1464 PreprocessStackTraces(); 1469 PreprocessStackTraces();
1465 DCHECK(incremental_marking()->IsStopped()); 1470 DCHECK(incremental_marking()->IsStopped());
1466 1471
1467 mark_compact_collector()->marking_deque()->StopUsing(); 1472 mark_compact_collector()->marking_deque()->StopUsing();
1468 } 1473 }
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
1579 // sweep collection by failing allocations. There is no sense in trying to 1584 // sweep collection by failing allocations. There is no sense in trying to
1580 // trigger one during scavenge: scavenges allocation should always succeed. 1585 // trigger one during scavenge: scavenges allocation should always succeed.
1581 AlwaysAllocateScope scope(isolate()); 1586 AlwaysAllocateScope scope(isolate());
1582 1587
1583 // Bump-pointer allocations done during scavenge are not real allocations. 1588 // Bump-pointer allocations done during scavenge are not real allocations.
1584 // Pause the inline allocation steps. 1589 // Pause the inline allocation steps.
1585 PauseAllocationObserversScope pause_observers(this); 1590 PauseAllocationObserversScope pause_observers(this);
1586 1591
1587 mark_compact_collector()->sweeper().EnsureNewSpaceCompleted(); 1592 mark_compact_collector()->sweeper().EnsureNewSpaceCompleted();
1588 1593
1589 gc_state_ = SCAVENGE; 1594 SetGCState(SCAVENGE);
1590 1595
1591 // Implements Cheney's copying algorithm 1596 // Implements Cheney's copying algorithm
1592 LOG(isolate_, ResourceEvent("scavenge", "begin")); 1597 LOG(isolate_, ResourceEvent("scavenge", "begin"));
1593 1598
1594 // Used for updating survived_since_last_expansion_ at function end. 1599 // Used for updating survived_since_last_expansion_ at function end.
1595 size_t survived_watermark = PromotedSpaceSizeOfObjects(); 1600 size_t survived_watermark = PromotedSpaceSizeOfObjects();
1596 1601
1597 scavenge_collector_->SelectScavengingVisitorsTable(); 1602 scavenge_collector_->SelectScavengingVisitorsTable();
1598 1603
1599 if (UsingEmbedderHeapTracer()) { 1604 if (UsingEmbedderHeapTracer()) {
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
1705 1710
1706 ArrayBufferTracker::FreeDeadInNewSpace(this); 1711 ArrayBufferTracker::FreeDeadInNewSpace(this);
1707 1712
1708 // Update how much has survived scavenge. 1713 // Update how much has survived scavenge.
1709 DCHECK_GE(PromotedSpaceSizeOfObjects(), survived_watermark); 1714 DCHECK_GE(PromotedSpaceSizeOfObjects(), survived_watermark);
1710 IncrementYoungSurvivorsCounter(PromotedSpaceSizeOfObjects() + 1715 IncrementYoungSurvivorsCounter(PromotedSpaceSizeOfObjects() +
1711 new_space_->Size() - survived_watermark); 1716 new_space_->Size() - survived_watermark);
1712 1717
1713 LOG(isolate_, ResourceEvent("scavenge", "end")); 1718 LOG(isolate_, ResourceEvent("scavenge", "end"));
1714 1719
1715 gc_state_ = NOT_IN_GC; 1720 SetGCState(NOT_IN_GC);
1716 } 1721 }
1717 1722
1718 1723
1719 String* Heap::UpdateNewSpaceReferenceInExternalStringTableEntry(Heap* heap, 1724 String* Heap::UpdateNewSpaceReferenceInExternalStringTableEntry(Heap* heap,
1720 Object** p) { 1725 Object** p) {
1721 MapWord first_word = HeapObject::cast(*p)->map_word(); 1726 MapWord first_word = HeapObject::cast(*p)->map_word();
1722 1727
1723 if (!first_word.IsForwardingAddress()) { 1728 if (!first_word.IsForwardingAddress()) {
1724 // Unreachable external string can be finalized. 1729 // Unreachable external string can be finalized.
1725 heap->FinalizeExternalString(String::cast(*p)); 1730 heap->FinalizeExternalString(String::cast(*p));
(...skipping 4750 matching lines...) Expand 10 before | Expand all | Expand 10 after
6476 } 6481 }
6477 6482
6478 6483
6479 // static 6484 // static
6480 int Heap::GetStaticVisitorIdForMap(Map* map) { 6485 int Heap::GetStaticVisitorIdForMap(Map* map) {
6481 return StaticVisitorBase::GetVisitorId(map); 6486 return StaticVisitorBase::GetVisitorId(map);
6482 } 6487 }
6483 6488
6484 } // namespace internal 6489 } // namespace internal
6485 } // namespace v8 6490 } // namespace v8
OLDNEW
« no previous file with comments | « src/heap/heap.h ('k') | src/heap/store-buffer.h » ('j') | src/heap/store-buffer.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698