• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
StatsScope(ZoneStats * zone_stats)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 
~StatsScope()25 ZoneStats::StatsScope::~StatsScope() {
26   DCHECK_EQ(zone_stats_->stats_.back(), this);
27   zone_stats_->stats_.pop_back();
28 }
29 
GetMaxAllocatedBytes()30 size_t ZoneStats::StatsScope::GetMaxAllocatedBytes() {
31   return std::max(max_allocated_bytes_, GetCurrentAllocatedBytes());
32 }
33 
GetCurrentAllocatedBytes()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 
GetTotalAllocatedBytes()47 size_t ZoneStats::StatsScope::GetTotalAllocatedBytes() {
48   return zone_stats_->GetTotalAllocatedBytes() -
49          total_allocated_bytes_at_start_;
50 }
51 
ZoneReturned(Zone * zone)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 
ZoneStats(AccountingAllocator * allocator)63 ZoneStats::ZoneStats(AccountingAllocator* allocator)
64     : max_allocated_bytes_(0), total_deleted_bytes_(0), allocator_(allocator) {}
65 
~ZoneStats()66 ZoneStats::~ZoneStats() {
67   DCHECK(zones_.empty());
68   DCHECK(stats_.empty());
69 }
70 
GetMaxAllocatedBytes()71 size_t ZoneStats::GetMaxAllocatedBytes() {
72   return std::max(max_allocated_bytes_, GetCurrentAllocatedBytes());
73 }
74 
GetCurrentAllocatedBytes()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 
GetTotalAllocatedBytes()83 size_t ZoneStats::GetTotalAllocatedBytes() {
84   return total_deleted_bytes_ + GetCurrentAllocatedBytes();
85 }
86 
NewEmptyZone(const char * zone_name)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 
ReturnZone(Zone * zone)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