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 #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:
     22     explicit Scope(ZonePool* zone_pool)
     23         : zone_pool_(zone_pool), zone_(nullptr) {}
     24     ~Scope() { Destroy(); }
     25 
     26     Zone* zone() {
     27       if (zone_ == nullptr) zone_ = zone_pool_->NewEmptyZone();
     28       return zone_;
     29     }
     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