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

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

Issue 10832199: Add a weak property type to the virtual machine. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: address review comments Created 8 years, 4 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/gc_marker.h" 5 #include "vm/gc_marker.h"
6 6
7 #include <map>
8 #include <utility>
9
7 #include "vm/allocation.h" 10 #include "vm/allocation.h"
8 #include "vm/dart_api_state.h" 11 #include "vm/dart_api_state.h"
9 #include "vm/isolate.h" 12 #include "vm/isolate.h"
10 #include "vm/pages.h" 13 #include "vm/pages.h"
11 #include "vm/raw_object.h" 14 #include "vm/raw_object.h"
12 #include "vm/stack_frame.h" 15 #include "vm/stack_frame.h"
13 #include "vm/visitor.h" 16 #include "vm/visitor.h"
14 17
15 namespace dart { 18 namespace dart {
16 19
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 } 133 }
131 134
132 MarkingStack* marking_stack() const { return marking_stack_; } 135 MarkingStack* marking_stack() const { return marking_stack_; }
133 136
134 void VisitPointers(RawObject** first, RawObject** last) { 137 void VisitPointers(RawObject** first, RawObject** last) {
135 for (RawObject** current = first; current <= last; current++) { 138 for (RawObject** current = first; current <= last; current++) {
136 MarkObject(*current, current); 139 MarkObject(*current, current);
137 } 140 }
138 } 141 }
139 142
143 void DelayWeakProperty(RawWeakProperty* raw_weak) {
144 RawObject* raw_key = raw_weak->ptr()->key_;
145 DelaySet::iterator it = delay_set_.find(raw_key);
146 if (it != delay_set_.end()) {
147 ASSERT(raw_key->IsWatched());
148 } else {
149 ASSERT(!raw_key->IsWatched());
150 raw_key->SetWatchedBit();
151 }
152 delay_set_.insert(std::make_pair(raw_key, raw_weak));
153 }
154
155 void Finalize() {
156 DelaySet::iterator it = delay_set_.begin();
157 for (; it != delay_set_.end(); ++it) {
158 WeakProperty::Clear(it->second);
159 }
160 }
161
140 void set_update_store_buffers(bool val) { update_store_buffers_ = val; } 162 void set_update_store_buffers(bool val) { update_store_buffers_ = val; }
141 163
142 private: 164 private:
143 void MarkAndPush(RawObject* raw_obj) { 165 void MarkAndPush(RawObject* raw_obj) {
144 ASSERT(raw_obj->IsHeapObject()); 166 ASSERT(raw_obj->IsHeapObject());
145 ASSERT(page_space_->Contains(RawObject::ToAddr(raw_obj))); 167 ASSERT(page_space_->Contains(RawObject::ToAddr(raw_obj)));
146 168
147 // Mark the object and push it on the marking stack. 169 // Mark the object and push it on the marking stack.
148 ASSERT(!raw_obj->IsMarked()); 170 ASSERT(!raw_obj->IsMarked());
149 RawClass* raw_class = isolate()->class_table()->At(raw_obj->GetClassId()); 171 RawClass* raw_class = isolate()->class_table()->At(raw_obj->GetClassId());
150 raw_obj->SetMarkBit(); 172 raw_obj->SetMarkBit();
173 if (raw_obj->IsWatched()) {
174 std::pair<DelaySet::iterator, DelaySet::iterator> ret;
175 ret = delay_set_.equal_range(raw_obj);
176 for (DelaySet::iterator it = ret.first; it != ret.second; ++it) {
177 it->second->VisitPointers(this);
178 }
179 delay_set_.erase(ret.first, ret.second);
180 raw_obj->ClearWatchedBit();
181 }
151 marking_stack_->Push(raw_obj); 182 marking_stack_->Push(raw_obj);
152 183
153 // Update the number of used bytes on this page for fast accounting. 184 // Update the number of used bytes on this page for fast accounting.
154 HeapPage* page = PageSpace::PageFor(raw_obj); 185 HeapPage* page = PageSpace::PageFor(raw_obj);
155 page->AddUsed(raw_obj->Size()); 186 page->AddUsed(raw_obj->Size());
156 187
157 // TODO(iposva): Should we mark the classes early? 188 // TODO(iposva): Should we mark the classes early?
158 MarkObject(raw_class, NULL); 189 MarkObject(raw_class, NULL);
159 } 190 }
160 191
(...skipping 16 matching lines...) Expand all
177 208
178 // TODO(iposva): merge old and code spaces. 209 // TODO(iposva): merge old and code spaces.
179 ASSERT(page_space_->Contains(RawObject::ToAddr(raw_obj))); 210 ASSERT(page_space_->Contains(RawObject::ToAddr(raw_obj)));
180 MarkAndPush(raw_obj); 211 MarkAndPush(raw_obj);
181 } 212 }
182 213
183 Heap* heap_; 214 Heap* heap_;
184 Heap* vm_heap_; 215 Heap* vm_heap_;
185 PageSpace* page_space_; 216 PageSpace* page_space_;
186 MarkingStack* marking_stack_; 217 MarkingStack* marking_stack_;
218 typedef std::multimap<RawObject*, RawWeakProperty*> DelaySet;
219 DelaySet delay_set_;
187 bool update_store_buffers_; 220 bool update_store_buffers_;
188 221
189 DISALLOW_IMPLICIT_CONSTRUCTORS(MarkingVisitor); 222 DISALLOW_IMPLICIT_CONSTRUCTORS(MarkingVisitor);
190 }; 223 };
191 224
192 225
193 bool IsUnreachable(const RawObject* raw_obj) { 226 bool IsUnreachable(const RawObject* raw_obj) {
194 if (!raw_obj->IsHeapObject()) { 227 if (!raw_obj->IsHeapObject()) {
195 return false; 228 return false;
196 } 229 }
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 } 344 }
312 } 345 }
313 } 346 }
314 347
315 348
316 void GCMarker::DrainMarkingStack(Isolate* isolate, 349 void GCMarker::DrainMarkingStack(Isolate* isolate,
317 MarkingVisitor* visitor) { 350 MarkingVisitor* visitor) {
318 visitor->set_update_store_buffers(true); 351 visitor->set_update_store_buffers(true);
319 while (!visitor->marking_stack()->IsEmpty()) { 352 while (!visitor->marking_stack()->IsEmpty()) {
320 RawObject* raw_obj = visitor->marking_stack()->Pop(); 353 RawObject* raw_obj = visitor->marking_stack()->Pop();
321 raw_obj->VisitPointers(visitor); 354 if (raw_obj->GetClassId() != kWeakPropertyCid) {
355 raw_obj->VisitPointers(visitor);
356 } else {
357 RawWeakProperty* raw_weak = reinterpret_cast<RawWeakProperty*>(raw_obj);
358 ProcessWeakProperty(raw_weak, visitor);
359 }
322 } 360 }
323 visitor->set_update_store_buffers(false); 361 visitor->set_update_store_buffers(false);
324 } 362 }
325 363
326 364
365 void GCMarker::ProcessWeakProperty(RawWeakProperty* raw_weak,
366 MarkingVisitor* visitor) {
367 // The fate of the weak property is determined by its key.
368 RawObject* raw_key = raw_weak->ptr()->key_;
369 if (!raw_key->IsMarked()) {
370 // Key is white. Delay the weak property.
371 visitor->DelayWeakProperty(raw_weak);
372 } else {
373 // Key is gray or black. Make the weak property black.
374 raw_weak->VisitPointers(visitor);
375 }
376 }
377
378
327 void GCMarker::MarkObjects(Isolate* isolate, 379 void GCMarker::MarkObjects(Isolate* isolate,
328 PageSpace* page_space, 380 PageSpace* page_space,
329 bool invoke_api_callbacks) { 381 bool invoke_api_callbacks) {
330 MarkingStack marking_stack; 382 MarkingStack marking_stack;
331 Prologue(isolate, invoke_api_callbacks); 383 Prologue(isolate, invoke_api_callbacks);
332 MarkingVisitor mark(isolate, heap_, page_space, &marking_stack); 384 MarkingVisitor mark(isolate, heap_, page_space, &marking_stack);
333 IterateRoots(isolate, &mark, !invoke_api_callbacks); 385 IterateRoots(isolate, &mark, !invoke_api_callbacks);
334 DrainMarkingStack(isolate, &mark); 386 DrainMarkingStack(isolate, &mark);
335 IterateWeakReferences(isolate, &mark); 387 IterateWeakReferences(isolate, &mark);
336 MarkingWeakVisitor mark_weak; 388 MarkingWeakVisitor mark_weak;
337 IterateWeakRoots(isolate, &mark_weak, invoke_api_callbacks); 389 IterateWeakRoots(isolate, &mark_weak, invoke_api_callbacks);
390 mark.Finalize();
338 Epilogue(isolate, invoke_api_callbacks); 391 Epilogue(isolate, invoke_api_callbacks);
339 } 392 }
340 393
341 } // namespace dart 394 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/gc_marker.h ('k') | runtime/vm/object.h » ('j') | runtime/vm/scavenger.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698