OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/zone.h" | 5 #include "src/zone.h" |
6 | 6 |
7 #include <cstring> | 7 #include <cstring> |
8 | 8 |
9 #include "src/v8.h" | 9 #include "src/v8.h" |
10 | 10 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 Address end() const { return address(size_); } | 65 Address end() const { return address(size_); } |
66 | 66 |
67 private: | 67 private: |
68 // Computes the address of the nth byte in this segment. | 68 // Computes the address of the nth byte in this segment. |
69 Address address(size_t n) const { return Address(this) + n; } | 69 Address address(size_t n) const { return Address(this) + n; } |
70 | 70 |
71 Segment* next_; | 71 Segment* next_; |
72 size_t size_; | 72 size_t size_; |
73 }; | 73 }; |
74 | 74 |
75 | 75 Zone::Zone(base::AccountingAllocator* allocator) |
76 Zone::Zone() | |
77 : allocation_size_(0), | 76 : allocation_size_(0), |
78 segment_bytes_allocated_(0), | 77 segment_bytes_allocated_(0), |
79 position_(0), | 78 position_(0), |
80 limit_(0), | 79 limit_(0), |
| 80 allocator_(allocator), |
81 segment_head_(nullptr) {} | 81 segment_head_(nullptr) {} |
82 | 82 |
83 | |
84 Zone::~Zone() { | 83 Zone::~Zone() { |
85 DeleteAll(); | 84 DeleteAll(); |
86 DeleteKeptSegment(); | 85 DeleteKeptSegment(); |
87 | 86 |
88 DCHECK(segment_bytes_allocated_ == 0); | 87 DCHECK(segment_bytes_allocated_ == 0); |
89 } | 88 } |
90 | 89 |
91 | 90 |
92 void* Zone::New(size_t size) { | 91 void* Zone::New(size_t size) { |
93 // Round up the requested size to fit the alignment. | 92 // Round up the requested size to fit the alignment. |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 segment_head_ = nullptr; | 193 segment_head_ = nullptr; |
195 } | 194 } |
196 | 195 |
197 DCHECK(segment_bytes_allocated_ == 0); | 196 DCHECK(segment_bytes_allocated_ == 0); |
198 } | 197 } |
199 | 198 |
200 | 199 |
201 // Creates a new segment, sets it size, and pushes it to the front | 200 // Creates a new segment, sets it size, and pushes it to the front |
202 // of the segment chain. Returns the new segment. | 201 // of the segment chain. Returns the new segment. |
203 Segment* Zone::NewSegment(size_t size) { | 202 Segment* Zone::NewSegment(size_t size) { |
204 Segment* result = reinterpret_cast<Segment*>(Malloced::New(size)); | 203 Segment* result = reinterpret_cast<Segment*>(allocator_->Allocate(size)); |
205 segment_bytes_allocated_ += size; | 204 segment_bytes_allocated_ += size; |
206 if (result != nullptr) { | 205 if (result != nullptr) { |
207 result->Initialize(segment_head_, size); | 206 result->Initialize(segment_head_, size); |
208 segment_head_ = result; | 207 segment_head_ = result; |
209 } | 208 } |
210 return result; | 209 return result; |
211 } | 210 } |
212 | 211 |
213 | 212 |
214 // Deletes the given segment. Does not touch the segment chain. | 213 // Deletes the given segment. Does not touch the segment chain. |
215 void Zone::DeleteSegment(Segment* segment, size_t size) { | 214 void Zone::DeleteSegment(Segment* segment, size_t size) { |
216 segment_bytes_allocated_ -= size; | 215 segment_bytes_allocated_ -= size; |
217 Malloced::Delete(segment); | 216 allocator_->Free(segment, size); |
218 } | 217 } |
219 | 218 |
220 | 219 |
221 Address Zone::NewExpand(size_t size) { | 220 Address Zone::NewExpand(size_t size) { |
222 // Make sure the requested size is already properly aligned and that | 221 // Make sure the requested size is already properly aligned and that |
223 // there isn't enough room in the Zone to satisfy the request. | 222 // there isn't enough room in the Zone to satisfy the request. |
224 DCHECK_EQ(size, RoundDown(size, kAlignment)); | 223 DCHECK_EQ(size, RoundDown(size, kAlignment)); |
225 DCHECK_LT(limit_, position_ + size); | 224 DCHECK_LT(limit_, position_ + size); |
226 | 225 |
227 // Compute the new segment size. We use a 'high water mark' | 226 // Compute the new segment size. We use a 'high water mark' |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 // size bytes + header and alignment padding) | 265 // size bytes + header and alignment padding) |
267 DCHECK(reinterpret_cast<uintptr_t>(position_) >= | 266 DCHECK(reinterpret_cast<uintptr_t>(position_) >= |
268 reinterpret_cast<uintptr_t>(result)); | 267 reinterpret_cast<uintptr_t>(result)); |
269 limit_ = segment->end(); | 268 limit_ = segment->end(); |
270 DCHECK(position_ <= limit_); | 269 DCHECK(position_ <= limit_); |
271 return result; | 270 return result; |
272 } | 271 } |
273 | 272 |
274 } // namespace internal | 273 } // namespace internal |
275 } // namespace v8 | 274 } // namespace v8 |
OLD | NEW |