diff options
Diffstat (limited to 'runtime/class_table.cc')
| -rw-r--r-- | runtime/class_table.cc | 24 | 
1 files changed, 15 insertions, 9 deletions
| 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<mirror::Class> 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<mirror::Class> klass) {  mirror::Class* ClassTable::LookupByDescriptor(ObjPtr<mirror::Class> 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<mirror::ClassLoader> 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<mirror::Class> 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<mirror::Class> klass) { -  classes_.back().Insert(TableSlot(klass)); +  const uint32_t hash = TableSlot::HashDescriptor(klass); +  classes_.back().InsertWithHash(TableSlot(klass, hash), hash);  }  void ClassTable::InsertWithHash(ObjPtr<mirror::Class> klass, size_t hash) { @@ -136,8 +140,8 @@ void ClassTable::InsertWithHash(ObjPtr<mirror::Class> 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<mirror::Class> klass) { +ClassTable::TableSlot::TableSlot(ObjPtr<mirror::Class> klass) +    : TableSlot(klass, HashDescriptor(klass)) {} + +uint32_t ClassTable::TableSlot::HashDescriptor(ObjPtr<mirror::Class> klass) {    std::string temp; -  data_.StoreRelaxed(Encode(klass.Ptr(), -                            MaskHash(ComputeModifiedUtf8Hash(klass->GetDescriptor(&temp))))); +  return ComputeModifiedUtf8Hash(klass->GetDescriptor(&temp));  }  }  // namespace art |