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(). 15namespace v8 { 16namespace internal { 17 18// Forward declarations. 19class AccountingAllocator; 20class Zone; 21 22class Segment { 23 public: 24 Zone* zone() const { return zone_; } 25 void set_zone(Zone* const zone) { zone_ = zone; } 26 27 Segment* next() const { return 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}. 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()}. 36 size_t capacity() const { return size_ - sizeof(Segment); } 37 38 Address start() const { return address(sizeof(Segment)); } 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 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. 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