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 declarations. |
19 | class AccountingAllocator; |
20 | class Zone; |
21 | |
22 | class 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 (); |
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 | |