V8 API Reference, 7.2.502.16 (for Deno 0.2.4)
zone-stats.cc
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
Definition: libplatform.h:13