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