Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(114)

Side by Side Diff: runtime/vm/scavenger.cc

Issue 9148051: Provide API support for weak handles and post-mortem finalization. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: a better strategy for protected handle checks Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 #include "vm/scavenger.h" 5 #include "vm/scavenger.h"
6 6
7 #include "vm/dart.h" 7 #include "vm/dart.h"
8 #include "vm/dart_api_state.h"
8 #include "vm/isolate.h" 9 #include "vm/isolate.h"
9 #include "vm/object.h" 10 #include "vm/object.h"
10 #include "vm/stack_frame.h" 11 #include "vm/stack_frame.h"
11 #include "vm/verifier.h" 12 #include "vm/verifier.h"
12 #include "vm/visitor.h" 13 #include "vm/visitor.h"
13 14
14 namespace dart { 15 namespace dart {
15 16
16 enum { 17 enum {
17 kForwardingMask = 3, 18 kForwardingMask = 3,
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 } 124 }
124 125
125 Scavenger* scavenger_; 126 Scavenger* scavenger_;
126 Heap* heap_; 127 Heap* heap_;
127 Heap* vm_heap_; 128 Heap* vm_heap_;
128 129
129 DISALLOW_COPY_AND_ASSIGN(ScavengerVisitor); 130 DISALLOW_COPY_AND_ASSIGN(ScavengerVisitor);
130 }; 131 };
131 132
132 133
133 class ScavengerWeakVisitor : public ObjectPointerVisitor { 134 class ScavengerWeakVisitor : public HandleVisitor {
134 public: 135 public:
135 explicit ScavengerWeakVisitor(Scavenger* scavenger) : scavenger_(scavenger) { 136 explicit ScavengerWeakVisitor(Scavenger* scavenger) : scavenger_(scavenger) {
136 } 137 }
137 138
138 void VisitPointers(RawObject** first, RawObject** last) { 139 void VisitHandle(uword* addr) {
139 for (RawObject** current = first; current <= last; current++) { 140 WeakPersistentHandle* handle =
140 RawObject* raw_obj = *current; 141 reinterpret_cast<WeakPersistentHandle*>(addr);
141 ASSERT(raw_obj->IsHeapObject()); 142 RawObject* raw_obj = handle->raw();
142 uword raw_addr = RawObject::ToAddr(raw_obj); 143 uword raw_addr = RawObject::ToAddr(raw_obj);
143 if (scavenger_->from_->Contains(raw_addr)) { 144 if (scavenger_->from_->Contains(raw_addr)) {
144 uword header = *reinterpret_cast<uword*>(raw_addr); 145 uword header = *reinterpret_cast<uword*>(raw_addr);
145 if (IsForwarding(header)) { 146 if (IsForwarding(header)) {
146 *current = RawObject::FromAddr(ForwardedAddr(header)); 147 handle->set_raw(RawObject::FromAddr(ForwardedAddr(header)));
147 } else { 148 } else {
148 *current = Object::null(); 149 handle->Finalize();
149 }
150 } 150 }
151 } 151 }
152 } 152 }
153 153
154 private: 154 private:
155 Scavenger* scavenger_; 155 Scavenger* scavenger_;
156 156
157 DISALLOW_COPY_AND_ASSIGN(ScavengerWeakVisitor); 157 DISALLOW_COPY_AND_ASSIGN(ScavengerWeakVisitor);
158 }; 158 };
159 159
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 // moment. 217 // moment.
218 survivor_end_ = top_; 218 survivor_end_ = top_;
219 219
220 #if defined(DEBUG) 220 #if defined(DEBUG)
221 memset(from_->pointer(), 0xf3, from_->size()); 221 memset(from_->pointer(), 0xf3, from_->size());
222 #endif // defined(DEBUG) 222 #endif // defined(DEBUG)
223 } 223 }
224 224
225 225
226 void Scavenger::IterateRoots(Isolate* isolate, ObjectPointerVisitor* visitor) { 226 void Scavenger::IterateRoots(Isolate* isolate, ObjectPointerVisitor* visitor) {
227 isolate->VisitStrongObjectPointers(visitor, 227 isolate->VisitObjectPointers(visitor,
228 StackFrameIterator::kDontValidateFrames); 228 StackFrameIterator::kDontValidateFrames);
229 heap_->IterateOldPointers(visitor); 229 heap_->IterateOldPointers(visitor);
230 } 230 }
231 231
232 232
233 void Scavenger::IterateWeakRoots(Isolate* isolate, 233 void Scavenger::IterateWeakRoots(Isolate* isolate, HandleVisitor* visitor) {
234 ObjectPointerVisitor* visitor) { 234 isolate->VisitWeakPersistentHandles(visitor);
235 isolate->VisitWeakObjectPointers(visitor);
236 } 235 }
237 236
238 237
239 void Scavenger::ProcessToSpace(ObjectPointerVisitor* visitor) { 238 void Scavenger::ProcessToSpace(ObjectPointerVisitor* visitor) {
240 uword resolved_top = FirstObjectStart(); 239 uword resolved_top = FirstObjectStart();
241 // Iterate until all work has been drained. 240 // Iterate until all work has been drained.
242 while ((resolved_top < top_) || PromotedStackHasMore()) { 241 while ((resolved_top < top_) || PromotedStackHasMore()) {
243 while (resolved_top < top_) { 242 while (resolved_top < top_) {
244 RawObject* raw_obj = RawObject::FromAddr(resolved_top); 243 RawObject* raw_obj = RawObject::FromAddr(resolved_top);
245 resolved_top += raw_obj->VisitPointers(visitor); 244 resolved_top += raw_obj->VisitPointers(visitor);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 OS::PrintErr(" done.\n"); 297 OS::PrintErr(" done.\n");
299 } 298 }
300 299
301 count_++; 300 count_++;
302 // Done scavenging. Reset the marker. 301 // Done scavenging. Reset the marker.
303 ASSERT(scavenging_); 302 ASSERT(scavenging_);
304 scavenging_ = false; 303 scavenging_ = false;
305 } 304 }
306 305
307 } // namespace dart 306 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698