1 // Copyright 2014 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "src/compiler/zone-stats.h" 6 7 namespace v8 { 8 namespace internal { 9 namespace compiler { 10 11 ZoneStats::StatsScope::StatsScope(ZoneStats* zone_stats) 12 : zone_stats_(zone_stats), 13 total_allocated_bytes_at_start_(zone_stats->GetTotalAllocatedBytes()), 14 max_allocated_bytes_(0) { 15 zone_stats_->stats_.push_back(this); 16 for (Zone* zone : zone_stats_->zones_) { 17 size_t size = static_cast<size_t>(zone->allocation_size()); 18 std::pair<InitialValues::iterator, bool> res = 19 initial_values_.insert(std::make_pair(zone, size)); 20 USE(res); 21 DCHECK(res.second); 22 } 23 } 24 25 ZoneStats::StatsScope::~StatsScope() { 26 DCHECK_EQ(zone_stats_->stats_.back(), this); 27 zone_stats_->stats_.pop_back(); 28 } 29 30 size_t ZoneStats::StatsScope::GetMaxAllocatedBytes() { 31 return std::max(max_allocated_bytes_, GetCurrentAllocatedBytes()); 32 } 33 34 size_t ZoneStats::StatsScope::GetCurrentAllocatedBytes() { 35 size_t total = 0; 36 for (Zone* zone : zone_stats_->zones_) { 37 total += static_cast<size_t>(zone->allocation_size()); 38 // Adjust for initial values. 39 InitialValues::iterator it = initial_values_.find(zone); 40 if (it != initial_values_.end()) { 41 total -= it->second; 42 } 43 } 44 return total; 45 } 46 47 size_t ZoneStats::StatsScope::GetTotalAllocatedBytes() { 48 return zone_stats_->GetTotalAllocatedBytes() - 49 total_allocated_bytes_at_start_; 50 } 51 52 void ZoneStats::StatsScope::ZoneReturned(Zone* zone) { 53 size_t current_total = GetCurrentAllocatedBytes(); 54 // Update max. 55 max_allocated_bytes_ = std::max(max_allocated_bytes_, current_total); 56 // Drop zone from initial value map. 57 InitialValues::iterator it = initial_values_.find(zone); 58 if (it != initial_values_.end()) { 59 initial_values_.erase(it); 60 } 61 } 62 63 ZoneStats::ZoneStats(AccountingAllocator* allocator) 64 : max_allocated_bytes_(0), total_deleted_bytes_(0), allocator_(allocator) {} 65 66 ZoneStats::~ZoneStats() { 67 DCHECK(zones_.empty()); 68 DCHECK(stats_.empty()); 69 } 70 71 size_t ZoneStats::GetMaxAllocatedBytes() { 72 return std::max(max_allocated_bytes_, GetCurrentAllocatedBytes()); 73 } 74 75 size_t ZoneStats::GetCurrentAllocatedBytes() { 76 size_t total = 0; 77 for (Zone* zone : zones_) { 78 total += static_cast<size_t>(zone->allocation_size()); 79 } 80 return total; 81 } 82 83 size_t ZoneStats::GetTotalAllocatedBytes() { 84 return total_deleted_bytes_ + GetCurrentAllocatedBytes(); 85 } 86 87 Zone* ZoneStats::NewEmptyZone(const char* zone_name) { 88 Zone* zone = new Zone(allocator_, zone_name); 89 zones_.push_back(zone); 90 return zone; 91 } 92 93 void ZoneStats::ReturnZone(Zone* zone) { 94 size_t current_total = GetCurrentAllocatedBytes(); 95 // Update max. 96 max_allocated_bytes_ = std::max(max_allocated_bytes_, current_total); 97 // Update stats. 98 for (StatsScope* stat_scope : stats_) { 99 stat_scope->ZoneReturned(zone); 100 } 101 // Remove from used. 102 Zones::iterator it = std::find(zones_.begin(), zones_.end(), zone); 103 DCHECK(it != zones_.end()); 104 zones_.erase(it); 105 total_deleted_bytes_ += static_cast<size_t>(zone->allocation_size()); 106 delete zone; 107 } 108 109 } // namespace compiler 110 } // namespace internal 111 } // namespace v8 112