• 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 <algorithm>
6 
7 #include "src/compiler/zone-stats.h"
8 
9 namespace v8 {
10 namespace internal {
11 namespace compiler {
12 
StatsScope(ZoneStats * zone_stats)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 
~StatsScope()27 ZoneStats::StatsScope::~StatsScope() {
28   DCHECK_EQ(zone_stats_->stats_.back(), this);
29   zone_stats_->stats_.pop_back();
30 }
31 
GetMaxAllocatedBytes()32 size_t ZoneStats::StatsScope::GetMaxAllocatedBytes() {
33   return std::max(max_allocated_bytes_, GetCurrentAllocatedBytes());
34 }
35 
GetCurrentAllocatedBytes()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 
GetTotalAllocatedBytes()49 size_t ZoneStats::StatsScope::GetTotalAllocatedBytes() {
50   return zone_stats_->GetTotalAllocatedBytes() -
51          total_allocated_bytes_at_start_;
52 }
53 
ZoneReturned(Zone * zone)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 
ZoneStats(AccountingAllocator * allocator)65 ZoneStats::ZoneStats(AccountingAllocator* allocator)
66     : max_allocated_bytes_(0), total_deleted_bytes_(0), allocator_(allocator) {}
67 
~ZoneStats()68 ZoneStats::~ZoneStats() {
69   DCHECK(zones_.empty());
70   DCHECK(stats_.empty());
71 }
72 
GetMaxAllocatedBytes() const73 size_t ZoneStats::GetMaxAllocatedBytes() const {
74   return std::max(max_allocated_bytes_, GetCurrentAllocatedBytes());
75 }
76 
GetCurrentAllocatedBytes() const77 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 
GetTotalAllocatedBytes() const85 size_t ZoneStats::GetTotalAllocatedBytes() const {
86   return total_deleted_bytes_ + GetCurrentAllocatedBytes();
87 }
88 
NewEmptyZone(const char * zone_name)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 
ReturnZone(Zone * zone)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