1 // Copyright 2016 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_ZONE_ZONE_SEGMENT_H_ 6 #define V8_ZONE_ZONE_SEGMENT_H_ 7 8 #include "src/init/v8.h" 9 10 // Segments represent chunks of memory: They have starting address 11 // (encoded in the this pointer) and a size in bytes. Segments are 12 // chained together forming a LIFO structure with the newest segment 13 // available as segment_head_. Segments are allocated using malloc() 14 // and de-allocated using free(). 15 namespace v8 { 16 namespace internal { 17 18 // Forward declarations. 19 class AccountingAllocator; 20 class Zone; 21 22 class Segment { 23 public: zone()24 Zone* zone() const { return zone_; } set_zone(Zone * const zone)25 void set_zone(Zone* const zone) { zone_ = zone; } 26 next()27 Segment* next() const { return next_; } set_next(Segment * const next)28 void set_next(Segment* const next) { next_ = next; } 29 30 // {total_size} returns the allocated size including the bookkeeping bytes of 31 // the {Segment}. total_size()32 size_t total_size() const { return size_; } 33 34 // {capacity} returns the number of storage bytes in this {Segment}, i.e. 35 // {end() - start()}. capacity()36 size_t capacity() const { return size_ - sizeof(Segment); } 37 start()38 Address start() const { return address(sizeof(Segment)); } end()39 Address end() const { return address(size_); } 40 41 // Zap the contents of the segment (but not the header). 42 void ZapContents(); 43 // Zaps the header and makes the segment unusable this way. 44 void ZapHeader(); 45 46 private: 47 // Segments are only created by the AccountingAllocator. 48 friend class AccountingAllocator; 49 Segment(size_t size)50 explicit Segment(size_t size) : size_(size) {} 51 52 #ifdef DEBUG 53 // Constant byte value used for zapping dead memory in debug mode. 54 static const unsigned char kZapDeadByte = 0xcd; 55 #endif 56 57 // Computes the address of the nth byte in this segment. address(size_t n)58 Address address(size_t n) const { 59 return reinterpret_cast<Address>(this) + n; 60 } 61 62 Zone* zone_ = nullptr; 63 Segment* next_ = nullptr; 64 const size_t size_; 65 }; 66 67 } // namespace internal 68 } // namespace v8 69 70 #endif // V8_ZONE_ZONE_SEGMENT_H_ 71