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 #ifndef V8_COMPILER_ZONE_POOL_H_ 6 #define V8_COMPILER_ZONE_POOL_H_ 7 8 #include <map> 9 #include <set> 10 #include <vector> 11 12 #include "src/zone.h" 13 14 namespace v8 { 15 namespace internal { 16 namespace compiler { 17 18 class ZonePool final { 19 public: 20 class Scope final { 21 public: Scope(ZonePool * zone_pool)22 explicit Scope(ZonePool* zone_pool) 23 : zone_pool_(zone_pool), zone_(nullptr) {} ~Scope()24 ~Scope() { Destroy(); } 25 zone()26 Zone* zone() { 27 if (zone_ == nullptr) zone_ = zone_pool_->NewEmptyZone(); 28 return zone_; 29 } Destroy()30 void Destroy() { 31 if (zone_ != nullptr) zone_pool_->ReturnZone(zone_); 32 zone_ = nullptr; 33 } 34 35 private: 36 ZonePool* const zone_pool_; 37 Zone* zone_; 38 DISALLOW_COPY_AND_ASSIGN(Scope); 39 }; 40 41 class StatsScope final { 42 public: 43 explicit StatsScope(ZonePool* zone_pool); 44 ~StatsScope(); 45 46 size_t GetMaxAllocatedBytes(); 47 size_t GetCurrentAllocatedBytes(); 48 size_t GetTotalAllocatedBytes(); 49 50 private: 51 friend class ZonePool; 52 void ZoneReturned(Zone* zone); 53 54 typedef std::map<Zone*, size_t> InitialValues; 55 56 ZonePool* const zone_pool_; 57 InitialValues initial_values_; 58 size_t total_allocated_bytes_at_start_; 59 size_t max_allocated_bytes_; 60 61 DISALLOW_COPY_AND_ASSIGN(StatsScope); 62 }; 63 64 explicit ZonePool(base::AccountingAllocator* allocator); 65 ~ZonePool(); 66 67 size_t GetMaxAllocatedBytes(); 68 size_t GetTotalAllocatedBytes(); 69 size_t GetCurrentAllocatedBytes(); 70 71 private: 72 Zone* NewEmptyZone(); 73 void ReturnZone(Zone* zone); 74 75 static const size_t kMaxUnusedSize = 3; 76 typedef std::vector<Zone*> Unused; 77 typedef std::vector<Zone*> Used; 78 typedef std::vector<StatsScope*> Stats; 79 80 Unused unused_; 81 Used used_; 82 Stats stats_; 83 size_t max_allocated_bytes_; 84 size_t total_deleted_bytes_; 85 base::AccountingAllocator* allocator_; 86 87 DISALLOW_COPY_AND_ASSIGN(ZonePool); 88 }; 89 90 } // namespace compiler 91 } // namespace internal 92 } // namespace v8 93 94 #endif 95