Home | History | Annotate | Download | only in compiler
      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