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

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

Issue 8528010: Changes to pass the current isolate to all runtime and native calls. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: '' Created 9 years, 1 month 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/isolate.h"
8 #include "vm/object.h" 9 #include "vm/object.h"
9 #include "vm/stack_frame.h" 10 #include "vm/stack_frame.h"
10 #include "vm/verifier.h" 11 #include "vm/verifier.h"
11 #include "vm/visitor.h" 12 #include "vm/visitor.h"
12 13
13 namespace dart { 14 namespace dart {
14 15
15 class ScavengerVisitor : public ObjectPointerVisitor { 16 class ScavengerVisitor : public ObjectPointerVisitor {
16 public: 17 public:
17 explicit ScavengerVisitor(Scavenger* scavenger) 18 explicit ScavengerVisitor(Scavenger* scavenger)
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 } 159 }
159 160
160 161
161 void Scavenger::Epilogue() { 162 void Scavenger::Epilogue() {
162 #if defined(DEBUG) 163 #if defined(DEBUG)
163 memset(from_->pointer(), 0xf3, from_->size()); 164 memset(from_->pointer(), 0xf3, from_->size());
164 #endif // defined(DEBUG) 165 #endif // defined(DEBUG)
165 } 166 }
166 167
167 168
168 void Scavenger::IterateRoots(ObjectPointerVisitor* visitor) { 169 void Scavenger::IterateRoots(Isolate* isolate, ObjectPointerVisitor* visitor) {
169 Isolate::Current()->VisitObjectPointers( 170 isolate->VisitObjectPointers(visitor,
170 visitor, StackFrameIterator::kDontValidateFrames); 171 StackFrameIterator::kDontValidateFrames);
171 heap_->IterateOldPointers(visitor); 172 heap_->IterateOldPointers(visitor);
172 } 173 }
173 174
174 175
175 void Scavenger::ProcessToSpace(ObjectPointerVisitor* visitor) { 176 void Scavenger::ProcessToSpace(ObjectPointerVisitor* visitor) {
176 uword resolved_top = FirstObjectStart(); 177 uword resolved_top = FirstObjectStart();
177 // Iterate until all work has been drained. 178 // Iterate until all work has been drained.
178 while (resolved_top < top_) { 179 while (resolved_top < top_) {
179 RawObject* raw_obj = RawObject::FromAddr(resolved_top); 180 RawObject* raw_obj = RawObject::FromAddr(resolved_top);
180 resolved_top += raw_obj->VisitPointers(visitor); 181 resolved_top += raw_obj->VisitPointers(visitor);
181 } 182 }
182 } 183 }
183 184
184 185
185 void Scavenger::VisitObjectPointers(ObjectPointerVisitor* visitor) const { 186 void Scavenger::VisitObjectPointers(ObjectPointerVisitor* visitor) const {
186 uword cur = FirstObjectStart(); 187 uword cur = FirstObjectStart();
187 while (cur < top_) { 188 while (cur < top_) {
188 RawObject* raw_obj = RawObject::FromAddr(cur); 189 RawObject* raw_obj = RawObject::FromAddr(cur);
189 cur += raw_obj->VisitPointers(visitor); 190 cur += raw_obj->VisitPointers(visitor);
190 } 191 }
191 } 192 }
192 193
193 194
194 void Scavenger::Scavenge() { 195 void Scavenger::Scavenge() {
195 // Scavenging is not reentrant. Make sure that is the case. 196 // Scavenging is not reentrant. Make sure that is the case.
196 ASSERT(!scavenging_); 197 ASSERT(!scavenging_);
197 scavenging_ = true; 198 scavenging_ = true;
198 NoHandleScope no_handles; 199 Isolate* isolate = Isolate::Current();
200 NoHandleScope no_handles(isolate);
199 201
200 Timer timer(FLAG_verbose_gc, "Scavenge"); 202 Timer timer(FLAG_verbose_gc, "Scavenge");
201 timer.Start(); 203 timer.Start();
202 // Setup the visitor and run a scavenge. 204 // Setup the visitor and run a scavenge.
203 ScavengerVisitor visitor(this); 205 ScavengerVisitor visitor(this);
204 Prologue(); 206 Prologue();
205 IterateRoots(&visitor); 207 IterateRoots(isolate, &visitor);
206 ProcessToSpace(&visitor); 208 ProcessToSpace(&visitor);
207 Epilogue(); 209 Epilogue();
208 timer.Stop(); 210 timer.Stop();
209 if (FLAG_verbose_gc) { 211 if (FLAG_verbose_gc) {
210 OS::PrintErr("Scavenge[%d]: %dus\n", count_, timer.TotalElapsedTime()); 212 OS::PrintErr("Scavenge[%d]: %dus\n", count_, timer.TotalElapsedTime());
211 } 213 }
212 214
213 count_++; 215 count_++;
214 // Done scavenging. Reset the marker. 216 // Done scavenging. Reset the marker.
215 ASSERT(scavenging_); 217 ASSERT(scavenging_);
216 scavenging_ = false; 218 scavenging_ = false;
217 } 219 }
218 220
219 } // namespace dart 221 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698