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().
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