From db70ce5e788404f36cb5dbb137c6a8f79f34a2a0 Mon Sep 17 00:00:00 2001 From: Mathieu Chartier Date: Mon, 12 Dec 2016 11:06:59 -0800 Subject: Address some review comments Addressed comments in dex cache and class table. Added class table test. Test: mm test-art-host-gtest-class_table_test -j20 Change-Id: I3ec0282247187acb1ec7af25b309501f001a1c3e --- runtime/class_table.cc | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) (limited to 'runtime/class_table.cc') diff --git a/runtime/class_table.cc b/runtime/class_table.cc index ec33e5ef80..0f985c6424 100644 --- a/runtime/class_table.cc +++ b/runtime/class_table.cc @@ -33,8 +33,9 @@ void ClassTable::FreezeSnapshot() { bool ClassTable::Contains(ObjPtr klass) { ReaderMutexLock mu(Thread::Current(), lock_); + TableSlot slot(klass); for (ClassSet& class_set : classes_) { - auto it = class_set.Find(TableSlot(klass)); + auto it = class_set.Find(slot); if (it != class_set.end()) { return it->Read() == klass; } @@ -44,8 +45,9 @@ bool ClassTable::Contains(ObjPtr klass) { mirror::Class* ClassTable::LookupByDescriptor(ObjPtr klass) { ReaderMutexLock mu(Thread::Current(), lock_); + TableSlot slot(klass); for (ClassSet& class_set : classes_) { - auto it = class_set.Find(TableSlot(klass)); + auto it = class_set.Find(slot); if (it != class_set.end()) { return it->Read(); } @@ -110,8 +112,8 @@ size_t ClassTable::NumNonZygoteClasses(ObjPtr defining_load } mirror::Class* ClassTable::Lookup(const char* descriptor, size_t hash) { - ReaderMutexLock mu(Thread::Current(), lock_); DescriptorHashPair pair(descriptor, hash); + ReaderMutexLock mu(Thread::Current(), lock_); for (ClassSet& class_set : classes_) { auto it = class_set.FindWithHash(pair, hash); if (it != class_set.end()) { @@ -122,12 +124,14 @@ mirror::Class* ClassTable::Lookup(const char* descriptor, size_t hash) { } void ClassTable::Insert(ObjPtr klass) { + const uint32_t hash = TableSlot::HashDescriptor(klass); WriterMutexLock mu(Thread::Current(), lock_); - classes_.back().Insert(TableSlot(klass)); + classes_.back().InsertWithHash(TableSlot(klass, hash), hash); } void ClassTable::InsertWithoutLocks(ObjPtr klass) { - classes_.back().Insert(TableSlot(klass)); + const uint32_t hash = TableSlot::HashDescriptor(klass); + classes_.back().InsertWithHash(TableSlot(klass, hash), hash); } void ClassTable::InsertWithHash(ObjPtr klass, size_t hash) { @@ -136,8 +140,8 @@ void ClassTable::InsertWithHash(ObjPtr klass, size_t hash) { } bool ClassTable::Remove(const char* descriptor) { - WriterMutexLock mu(Thread::Current(), lock_); DescriptorHashPair pair(descriptor, ComputeModifiedUtf8Hash(descriptor)); + WriterMutexLock mu(Thread::Current(), lock_); for (ClassSet& class_set : classes_) { auto it = class_set.Find(pair); if (it != class_set.end()) { @@ -250,10 +254,12 @@ void ClassTable::ClearStrongRoots() { strong_roots_.clear(); } -ClassTable::TableSlot::TableSlot(ObjPtr klass) { +ClassTable::TableSlot::TableSlot(ObjPtr klass) + : TableSlot(klass, HashDescriptor(klass)) {} + +uint32_t ClassTable::TableSlot::HashDescriptor(ObjPtr klass) { std::string temp; - data_.StoreRelaxed(Encode(klass.Ptr(), - MaskHash(ComputeModifiedUtf8Hash(klass->GetDescriptor(&temp))))); + return ComputeModifiedUtf8Hash(klass->GetDescriptor(&temp)); } } // namespace art -- cgit v1.2.3-59-g8ed1b