// Copyright 2014 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include <algorithm> #include "src/compiler/zone-stats.h" namespace v8 { namespace internal { namespace compiler { ZoneStats::StatsScope::StatsScope(ZoneStats* zone_stats) : zone_stats_(zone_stats), total_allocated_bytes_at_start_(zone_stats->GetTotalAllocatedBytes()), max_allocated_bytes_(0) { zone_stats_->stats_.push_back(this); for (Zone* zone : zone_stats_->zones_) { size_t size = static_cast<size_t>(zone->allocation_size()); std::pair<InitialValues::iterator, bool> res = initial_values_.insert(std::make_pair(zone, size)); USE(res); DCHECK(res.second); } } ZoneStats::StatsScope::~StatsScope() { DCHECK_EQ(zone_stats_->stats_.back(), this); zone_stats_->stats_.pop_back(); } size_t ZoneStats::StatsScope::GetMaxAllocatedBytes() { return std::max(max_allocated_bytes_, GetCurrentAllocatedBytes()); } size_t ZoneStats::StatsScope::GetCurrentAllocatedBytes() { size_t total = 0; for (Zone* zone : zone_stats_->zones_) { total += static_cast<size_t>(zone->allocation_size()); // Adjust for initial values. InitialValues::iterator it = initial_values_.find(zone); if (it != initial_values_.end()) { total -= it->second; } } return total; } size_t ZoneStats::StatsScope::GetTotalAllocatedBytes() { return zone_stats_->GetTotalAllocatedBytes() - total_allocated_bytes_at_start_; } void ZoneStats::StatsScope::ZoneReturned(Zone* zone) { size_t current_total = GetCurrentAllocatedBytes(); // Update max. max_allocated_bytes_ = std::max(max_allocated_bytes_, current_total); // Drop zone from initial value map. InitialValues::iterator it = initial_values_.find(zone); if (it != initial_values_.end()) { initial_values_.erase(it); } } ZoneStats::ZoneStats(AccountingAllocator* allocator) : max_allocated_bytes_(0), total_deleted_bytes_(0), allocator_(allocator) {} ZoneStats::~ZoneStats() { DCHECK(zones_.empty()); DCHECK(stats_.empty()); } size_t ZoneStats::GetMaxAllocatedBytes() const { return std::max(max_allocated_bytes_, GetCurrentAllocatedBytes()); } size_t ZoneStats::GetCurrentAllocatedBytes() const { size_t total = 0; for (Zone* zone : zones_) { total += static_cast<size_t>(zone->allocation_size()); } return total; } size_t ZoneStats::GetTotalAllocatedBytes() const { return total_deleted_bytes_ + GetCurrentAllocatedBytes(); } Zone* ZoneStats::NewEmptyZone(const char* zone_name) { Zone* zone = new Zone(allocator_, zone_name); zones_.push_back(zone); return zone; } void ZoneStats::ReturnZone(Zone* zone) { size_t current_total = GetCurrentAllocatedBytes(); // Update max. max_allocated_bytes_ = std::max(max_allocated_bytes_, current_total); // Update stats. for (StatsScope* stat_scope : stats_) { stat_scope->ZoneReturned(zone); } // Remove from used. Zones::iterator it = std::find(zones_.begin(), zones_.end(), zone); DCHECK(it != zones_.end()); zones_.erase(it); total_deleted_bytes_ += static_cast<size_t>(zone->allocation_size()); delete zone; } } // namespace compiler } // namespace internal } // namespace v8