Concurrent class linker and intern table root marking
We now mark the class linker and intern table roots concurrently
(with mutators unpaused), only re-marking these roots in the second pause if
they get dirtied.
Reduces root marking time by ~1ms for each pause.
Change-Id: I833fc557bac9a2930868db715587318293fa4655
diff --git a/src/class_linker.h b/src/class_linker.h
index 096d602..460fcd2 100644
--- a/src/class_linker.h
+++ b/src/class_linker.h
@@ -262,7 +262,7 @@
void VisitClassesWithoutClassesLock(ClassVisitor* visitor, void* arg) const
LOCKS_EXCLUDED(Locks::classlinker_classes_lock_);
- void VisitRoots(Heap::RootVisitor* visitor, void* arg) const
+ void VisitRoots(Heap::RootVisitor* visitor, void* arg)
LOCKS_EXCLUDED(Locks::classlinker_classes_lock_, dex_lock_);
DexCache* FindDexCache(const DexFile& dex_file) const
@@ -378,6 +378,14 @@
pid_t GetClassesLockOwner(); // For SignalCatcher.
pid_t GetDexLockOwner(); // For SignalCatcher.
+ bool IsDirty() const {
+ return is_dirty_;
+ }
+
+ void Dirty() {
+ is_dirty_ = true;
+ }
+
private:
explicit ClassLinker(InternTable*);
@@ -636,6 +644,7 @@
IfTable* array_iftable_;
bool init_done_;
+ bool is_dirty_;
InternTable* intern_table_;