summaryrefslogtreecommitdiff
path: root/src/class_linker.cc
diff options
context:
space:
mode:
author Mathieu Chartier <mathieuc@google.com> 2012-10-26 13:51:26 -0700
committer Mathieu Chartier <mathieuc@google.com> 2012-11-06 16:07:36 -0800
commit02b6a78038f12c109f95eb31713cfc747f5512f1 (patch)
treec36841561a47b2ce3cf15b00fdae822e5a6c5b64 /src/class_linker.cc
parentbcc2926b9721f94c17ed98fae5264cc98f0e066f (diff)
Parellel mark stack processing
Enabled parallel mark stack processing by using a thread pool. Optimized object scanning by removing dependent loads for IsClass. Performance: Prime: ~10% speedup of partial GC. Nakasi: ~50% speedup of partial GC. Change-Id: I43256a068efc47cb52d93108458ea18d4e02fccc
Diffstat (limited to 'src/class_linker.cc')
-rw-r--r--src/class_linker.cc14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/class_linker.cc b/src/class_linker.cc
index dc86aed4a1..ce9b37bb7c 100644
--- a/src/class_linker.cc
+++ b/src/class_linker.cc
@@ -240,6 +240,7 @@ void ClassLinker::InitFromCompiler(const std::vector<const DexFile*>& boot_class
SirtRef<Class>
java_lang_Class(self, down_cast<Class*>(heap->AllocObject(self, NULL, sizeof(ClassClass))));
CHECK(java_lang_Class.get() != NULL);
+ Class::SetClassClass(java_lang_Class.get());
java_lang_Class->SetClass(java_lang_Class.get());
java_lang_Class->SetClassSize(sizeof(ClassClass));
// AllocClass(Class*) can now be used
@@ -972,11 +973,12 @@ void ClassLinker::InitFromImage() {
Object* dex_caches_object = space->GetImageHeader().GetImageRoot(ImageHeader::kDexCaches);
ObjectArray<DexCache>* dex_caches = dex_caches_object->AsObjectArray<DexCache>();
+ ObjectArray<Class>* class_roots =
+ space->GetImageHeader().GetImageRoot(ImageHeader::kClassRoots)->AsObjectArray<Class>();
+
// Special case of setting up the String class early so that we can test arbitrary objects
// as being Strings or not
- Class* java_lang_String = space->GetImageHeader().GetImageRoot(ImageHeader::kClassRoots)
- ->AsObjectArray<Class>()->Get(kJavaLangString);
- String::SetClass(java_lang_String);
+ String::SetClass(class_roots->Get(kJavaLangString));
CHECK_EQ(oat_file->GetOatHeader().GetDexFileCount(),
static_cast<uint32_t>(dex_caches->GetLength()));
@@ -1004,9 +1006,8 @@ void ClassLinker::InitFromImage() {
}
// reinit class_roots_
- Object* class_roots_object =
- heap->GetImageSpace()->GetImageHeader().GetImageRoot(ImageHeader::kClassRoots);
- class_roots_ = class_roots_object->AsObjectArray<Class>();
+ Class::SetClassClass(class_roots->Get(kJavaLangClass));
+ class_roots_ = class_roots;
// reinit array_iftable_ from any array class instance, they should be ==
array_iftable_ = GetClassRoot(kObjectArrayClass)->GetIfTable();
@@ -1112,6 +1113,7 @@ void ClassLinker::VisitClassesWithoutClassesLock(ClassVisitor* visitor, void* ar
ClassLinker::~ClassLinker() {
+ Class::ResetClass();
String::ResetClass();
Field::ResetClass();
AbstractMethod::ResetClasses();