OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #ifndef VM_SCAVENGER_H_ | 5 #ifndef VM_SCAVENGER_H_ |
6 #define VM_SCAVENGER_H_ | 6 #define VM_SCAVENGER_H_ |
7 | 7 |
8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
9 #include "platform/utils.h" | 9 #include "platform/utils.h" |
10 #include "vm/dart.h" | 10 #include "vm/dart.h" |
11 #include "vm/flags.h" | 11 #include "vm/flags.h" |
12 #include "vm/globals.h" | 12 #include "vm/globals.h" |
13 #include "vm/raw_object.h" | 13 #include "vm/raw_object.h" |
14 #include "vm/spaces.h" | 14 #include "vm/spaces.h" |
15 #include "vm/virtual_memory.h" | 15 #include "vm/virtual_memory.h" |
16 #include "vm/visitor.h" | 16 #include "vm/visitor.h" |
17 | 17 |
18 namespace dart { | 18 namespace dart { |
19 | 19 |
20 // Forward declarations. | 20 // Forward declarations. |
21 class Heap; | 21 class Heap; |
22 class Isolate; | 22 class Isolate; |
23 class JSONObject; | 23 class JSONObject; |
24 class ScavengerVisitor; | 24 class ScavengerVisitor; |
25 | 25 |
26 DECLARE_FLAG(bool, gc_at_alloc); | 26 DECLARE_FLAG(bool, gc_at_alloc); |
27 | 27 |
28 | |
29 // Wrapper around VirtualMemory that adds caching and handles the empty case. | |
30 class SemiSpace { | |
31 public: | |
Ivan Posva
2014/06/05 22:27:29
Please use vertical space for easier reading.
koda
2014/06/05 23:04:23
Done.
| |
32 static void InitOnce(); | |
33 // Get a space of the given size. Returns NULL on out of memory. If size is 0, | |
34 // returns an empty space: pointer(), start() and end() all return NULL/0. | |
35 static SemiSpace* New(intptr_t size); | |
36 // Hand back an unused space. Safe to call on NULL. | |
Ivan Posva
2014/06/05 22:27:29
Why would we ever want to call Delete on NULL?
koda
2014/06/05 23:04:23
Allowing NULL keeps it consistent with the 'delete
koda
2014/06/05 23:08:29
Actually, the commit failure check in this very CL
| |
37 void Delete(); | |
38 void* pointer() const { return region_.pointer(); } | |
39 uword start() const { return region_.start(); } | |
40 uword end() const { return region_.end(); } | |
41 intptr_t size() const { return static_cast<intptr_t>(region_.size()); } | |
42 bool Contains(uword address) const { return region_.Contains(address); } | |
43 // Set write protection mode for this space. The space must not be protected | |
44 // when Delete is called. | |
45 // TODO(koda): Remember protection mode in VirtualMemory and assert this. | |
46 void WriteProtect(bool read_only); | |
Ivan Posva
2014/06/05 22:27:29
Do we ever write protect a new gen?
koda
2014/06/05 23:04:23
Heap::WriteProtect includes new gen, but it's curr
| |
47 private: | |
48 explicit SemiSpace(VirtualMemory* reserved); | |
49 ~SemiSpace(); | |
50 VirtualMemory* reserved_; // NULL for an emtpy space. | |
51 MemoryRegion region_; | |
52 static SemiSpace* cache_; | |
53 static Mutex* mutex_; | |
54 }; | |
55 | |
56 | |
28 class Scavenger { | 57 class Scavenger { |
29 public: | 58 public: |
30 Scavenger(Heap* heap, intptr_t max_capacity_in_words, uword object_alignment); | 59 Scavenger(Heap* heap, intptr_t max_capacity_in_words, uword object_alignment); |
31 ~Scavenger(); | 60 ~Scavenger(); |
32 | 61 |
33 // Check whether this Scavenger contains this address. | 62 // Check whether this Scavenger contains this address. |
34 // During scavenging both the to and from spaces contain "legal" objects. | 63 // During scavenging both the to and from spaces contain "legal" objects. |
35 // During a scavenge this function only returns true for addresses that will | 64 // During a scavenge this function only returns true for addresses that will |
36 // be part of the surviving objects. | 65 // be part of the surviving objects. |
37 bool Contains(uword addr) const { | 66 bool Contains(uword addr) const { |
38 // No reasonable algorithm should be checking for objects in from space. At | 67 // No reasonable algorithm should be checking for objects in from space. At |
39 // least unless it is debugging code. This might need to be relaxed later, | 68 // least unless it is debugging code. This might need to be relaxed later, |
40 // but currently it helps prevent dumb bugs. | 69 // but currently it helps prevent dumb bugs. |
41 ASSERT(!from_->Contains(addr)); | 70 ASSERT(from_ == NULL || !from_->Contains(addr)); |
42 return to_->Contains(addr); | 71 return to_->Contains(addr); |
43 } | 72 } |
44 | 73 |
45 RawObject* FindObject(FindObjectVisitor* visitor) const; | 74 RawObject* FindObject(FindObjectVisitor* visitor) const; |
46 | 75 |
47 uword TryAllocate(intptr_t size) { | 76 uword TryAllocate(intptr_t size) { |
48 ASSERT(Utils::IsAligned(size, kObjectAlignment)); | 77 ASSERT(Utils::IsAligned(size, kObjectAlignment)); |
49 ASSERT(heap_ != Dart::vm_isolate()->heap()); | 78 ASSERT(heap_ != Dart::vm_isolate()->heap()); |
50 #if defined(DEBUG) | 79 #if defined(DEBUG) |
51 if (FLAG_gc_at_alloc && !scavenging_) { | 80 if (FLAG_gc_at_alloc && !scavenging_) { |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
176 ASSERT(end_ <= to_->end()); | 205 ASSERT(end_ <= to_->end()); |
177 return result; | 206 return result; |
178 } | 207 } |
179 bool PromotedStackHasMore() const { | 208 bool PromotedStackHasMore() const { |
180 ASSERT(scavenging_); | 209 ASSERT(scavenging_); |
181 return end_ < to_->end(); | 210 return end_ < to_->end(); |
182 } | 211 } |
183 | 212 |
184 void ProcessWeakTables(); | 213 void ProcessWeakTables(); |
185 | 214 |
186 VirtualMemory* space_; | 215 SemiSpace* from_; |
187 MemoryRegion* to_; | 216 SemiSpace* to_; |
188 MemoryRegion* from_; | |
189 | 217 |
190 Heap* heap_; | 218 Heap* heap_; |
191 | 219 |
192 // Current allocation top and end. These values are being accessed directly | 220 // Current allocation top and end. These values are being accessed directly |
193 // from generated code. | 221 // from generated code. |
194 uword top_; | 222 uword top_; |
195 uword end_; | 223 uword end_; |
196 | 224 |
197 // A pointer to the first unscanned object. Scanning completes when | 225 // A pointer to the first unscanned object. Scanning completes when |
198 // this value meets the allocation top. | 226 // this value meets the allocation top. |
(...skipping 16 matching lines...) Expand all Loading... | |
215 | 243 |
216 friend class ScavengerVisitor; | 244 friend class ScavengerVisitor; |
217 friend class ScavengerWeakVisitor; | 245 friend class ScavengerWeakVisitor; |
218 | 246 |
219 DISALLOW_COPY_AND_ASSIGN(Scavenger); | 247 DISALLOW_COPY_AND_ASSIGN(Scavenger); |
220 }; | 248 }; |
221 | 249 |
222 } // namespace dart | 250 } // namespace dart |
223 | 251 |
224 #endif // VM_SCAVENGER_H_ | 252 #endif // VM_SCAVENGER_H_ |
OLD | NEW |