Home | History | Annotate | Download | only in zone
      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/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 declaration
     19 class Zone;
     20 
     21 class Segment {
     22  public:
     23   void Initialize(size_t size) { size_ = size; }
     24 
     25   Zone* zone() const { return zone_; }
     26   void set_zone(Zone* const zone) { zone_ = zone; }
     27 
     28   Segment* next() const { return next_; }
     29   void set_next(Segment* const next) { next_ = next; }
     30 
     31   size_t size() const { return size_; }
     32   size_t capacity() const { return size_ - sizeof(Segment); }
     33 
     34   Address start() const { return address(sizeof(Segment)); }
     35   Address end() const { return address(size_); }
     36 
     37   // Zap the contents of the segment (but not the header).
     38   void ZapContents();
     39   // Zaps the header and makes the segment unusable this way.
     40   void ZapHeader();
     41 
     42  private:
     43 #ifdef DEBUG
     44   // Constant byte value used for zapping dead memory in debug mode.
     45   static const unsigned char kZapDeadByte = 0xcd;
     46 #endif
     47 
     48   // Computes the address of the nth byte in this segment.
     49   Address address(size_t n) const { return Address(this) + n; }
     50 
     51   Zone* zone_;
     52   Segment* next_;
     53   size_t size_;
     54 };
     55 }  // namespace internal
     56 }  // namespace v8
     57 
     58 #endif  // V8_ZONE_ZONE_SEGMENT_H_
     59