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

Unified Diff: vm/heap.cc

Issue 10223015: Add a stub_code_space in the heap alongside code_space so that stub code generation happens here an… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 8 years, 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « vm/heap.h ('k') | vm/object.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: vm/heap.cc
===================================================================
--- vm/heap.cc (revision 6972)
+++ vm/heap.cc (working copy)
@@ -31,7 +31,10 @@
"e.g: --old_gen_heap_size=1024 allocates a 1024MB old gen heap");
DEFINE_FLAG(int, code_heap_size, Heap::kCodeHeapSizeInMB,
"code heap size in MB,"
- "e.g: --code_heap_size=8 allocates a 8MB old gen heap");
+ "e.g: --code_heap_size=8 allocates a 8MB code heap");
+DEFINE_FLAG(int, stub_code_heap_size, Heap::kStubCodeHeapSizeInKB,
+ "stub code heap size in KB,"
+ "e.g: --code_heap_size=256 allocates a 256KB stub code heap");
Ivan Posva 2012/04/26 15:09:01 Mismatch in flag comment.
siva 2012/04/26 16:51:42 Done.
Heap::Heap() {
new_space_ = new Scavenger(this,
@@ -39,6 +42,7 @@
kNewObjectAlignmentOffset);
old_space_ = new PageSpace(this, (FLAG_old_gen_heap_size * MB));
code_space_ = new PageSpace(this, (FLAG_code_heap_size * MB), true);
+ stub_code_space_ = new PageSpace(this, (FLAG_stub_code_heap_size * KB), true);
}
@@ -46,6 +50,7 @@
delete new_space_;
delete old_space_;
delete code_space_;
+ delete stub_code_space_;
}
@@ -57,10 +62,12 @@
}
CollectGarbage(kNew);
if (FLAG_verbose_gc) {
- OS::PrintErr("New space (%dk) Old space (%dk) Code space (%dk)\n",
+ OS::PrintErr("New space (%dk) Old space (%dk) "
+ "Code space (%dk) Stub Code space(%dk)\n",
(new_space_->in_use() / KB),
(old_space_->in_use() / KB),
- (code_space_->in_use() / KB));
+ (code_space_->in_use() / KB),
+ (stub_code_space_->in_use() / KB));
}
addr = new_space_->TryAllocate(size);
if (addr != 0) {
@@ -76,10 +83,12 @@
if (addr == 0) {
CollectAllGarbage();
if (FLAG_verbose_gc) {
- OS::PrintErr("New space (%dk) Old space (%dk) Code space (%dk)\n",
+ OS::PrintErr("New space (%dk) Old space (%dk) "
+ "Code space (%dk) Stub Code space(%dk)\n",
(new_space_->in_use() / KB),
(old_space_->in_use() / KB),
- (code_space_->in_use() / KB));
+ (code_space_->in_use() / KB),
+ (stub_code_space_->in_use() / KB));
}
addr = old_space_->TryAllocate(size);
if (addr == 0) {
@@ -91,10 +100,10 @@
}
-uword Heap::AllocateCode(intptr_t size) {
+uword Heap::AllocateCode(PageSpace* space, intptr_t size) {
ASSERT(Isolate::Current()->no_gc_scope_depth() == 0);
ASSERT(Utils::IsAligned(size, OS::PreferredCodeAlignment()));
- uword addr = code_space_->TryAllocate(size);
+ uword addr = space->TryAllocate(size);
if (addr == 0) {
// TODO(iposva): Support GC.
FATAL("Exhausted code heap space.");
@@ -109,7 +118,8 @@
bool Heap::Contains(uword addr) const {
return new_space_->Contains(addr) ||
old_space_->Contains(addr) ||
- code_space_->Contains(addr);
+ code_space_->Contains(addr) ||
+ stub_code_space_->Contains(addr);
}
@@ -118,6 +128,11 @@
}
+bool Heap::StubCodeContains(uword addr) const {
+ return stub_code_space_->Contains(addr);
+}
+
+
void Heap::IterateNewPointers(ObjectPointerVisitor* visitor) {
new_space_->VisitObjectPointers(visitor);
}
@@ -126,6 +141,7 @@
void Heap::IterateOldPointers(ObjectPointerVisitor* visitor) {
old_space_->VisitObjectPointers(visitor);
code_space_->VisitObjectPointers(visitor);
+ stub_code_space_->VisitObjectPointers(visitor);
}
@@ -134,6 +150,11 @@
}
+void Heap::IterateStubCodePointers(ObjectPointerVisitor* visitor) {
+ stub_code_space_->VisitObjectPointers(visitor);
+}
+
+
RawInstructions* Heap::FindObjectInCodeSpace(FindObjectVisitor* visitor) {
// The code heap can only have RawInstructions objects.
RawObject* raw_obj = code_space_->FindObject(visitor);
@@ -143,6 +164,15 @@
}
+RawInstructions* Heap::FindObjectInStubCodeSpace(FindObjectVisitor* visitor) {
+ // The stub code heap can only have RawInstructions objects.
+ RawObject* raw_obj = stub_code_space_->FindObject(visitor);
+ ASSERT((raw_obj == Object::null()) ||
+ (raw_obj->ptr()->class_->ptr()->instance_kind_ == kInstructions));
+ return reinterpret_cast<RawInstructions*>(raw_obj);
+}
+
+
void Heap::CollectGarbage(Space space, ApiCallbacks api_callbacks) {
bool invoke_api_callbacks = (api_callbacks == kInvokeApiCallbacks);
switch (space) {
@@ -152,10 +182,14 @@
case kOld:
old_space_->MarkSweep(invoke_api_callbacks);
break;
- case kExecutable:
+ case kDartCode:
UNIMPLEMENTED();
code_space_->MarkSweep(invoke_api_callbacks);
break;
+ case kStubCode:
+ UNIMPLEMENTED();
+ stub_code_space_->MarkSweep(invoke_api_callbacks);
+ break;
default:
UNREACHABLE();
}
@@ -164,10 +198,10 @@
void Heap::CollectGarbage(Space space) {
ApiCallbacks api_callbacks;
- if (space == kNew || space == kExecutable) {
+ if (space == kOld) {
+ api_callbacks = kInvokeApiCallbacks;
+ } else {
api_callbacks = kIgnoreApiCallbacks;
- } else {
- api_callbacks = kInvokeApiCallbacks;
}
CollectGarbage(space, api_callbacks);
}
@@ -178,6 +212,7 @@
old_space_->MarkSweep(kInvokeApiCallbacks);
// TODO(iposva): Merge old and code space.
// code_space_->MarkSweep(kInvokeApiCallbacks);
+ // stub_code_space_->MarkSweep(kInvokeApiCallbacks);
}
@@ -203,6 +238,7 @@
new_space_->VisitObjectPointers(&visitor);
old_space_->VisitObjectPointers(&visitor);
code_space_->VisitObjectPointers(&visitor);
+ stub_code_space_->VisitObjectPointers(&visitor);
// Only returning a value so that Heap::Validate can be called from an ASSERT.
return true;
}
« no previous file with comments | « vm/heap.h ('k') | vm/object.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698