Index: working_vm/vm/vmcore/include/classloader.h =================================================================== --- working_vm/vm/vmcore/include/classloader.h (revision 631623) +++ working_vm/vm/vmcore/include/classloader.h (working copy) @@ -167,10 +167,12 @@ virtual bool Initialize( ManagedObject* loader = NULL ); Class* LookupClass(const String* name) { - LMAutoUnlock aulock(&m_lock); + Class** klass = m_loadedClasses->Lookup(name); - if(klass == NULL) + if(klass == NULL) { + LMAutoUnlock aulock(&m_lock); klass = m_initiatedClasses->Lookup(name); + } return klass?*klass:NULL; } void RemoveFromReported(const String* name){ Index: working_vm/vm/vmcore/src/class_support/Resolve.cpp =================================================================== --- working_vm/vm/vmcore/src/class_support/Resolve.cpp (revision 631623) +++ working_vm/vm/vmcore/src/class_support/Resolve.cpp (working copy) @@ -148,18 +148,20 @@ assert(hythread_is_suspend_enabled()); ConstantPool& cp = m_const_pool; - lock(); +// lock(); if(cp.is_entry_in_error(cp_index)) { TRACE2("resolve.testing", "Constant pool entry " << cp_index << " already contains error."); - unlock(); +// unlock(); return NULL; } if(cp.is_entry_resolved(cp_index)) { - unlock(); +// unlock(); return cp.get_class_class(cp_index); } +// added + lock(); const String* classname = cp.get_utf8_string(cp.get_class_name_index(cp_index)); unlock(); @@ -400,7 +402,7 @@ Field* Class::_resolve_field(Global_Env *env, unsigned cp_index) { - lock(); +// lock(); if(m_const_pool.is_entry_in_error(cp_index)) { TRACE2("resolve.testing", "Constant pool entry " << cp_index << " already contains error."); unlock(); @@ -408,13 +410,15 @@ } if(m_const_pool.is_entry_resolved(cp_index)) { - unlock(); +// unlock(); return m_const_pool.get_ref_field(cp_index); } // // constant pool entry hasn't been resolved yet // +// added + lock(); unsigned other_index = m_const_pool.get_ref_class_index(cp_index); unlock(); @@ -560,21 +564,23 @@ Method* Class::_resolve_method(Global_Env* env, unsigned cp_index) { - lock(); +// lock(); if(m_const_pool.is_entry_in_error(cp_index)) { TRACE2("resolve.testing", "Constant pool entry " << cp_index << " already contains error."); - unlock(); +// unlock(); return NULL; } if(m_const_pool.is_entry_resolved(cp_index)) { - unlock(); +// unlock(); return m_const_pool.get_ref_method(cp_index); } // // constant pool entry hasn't been resolved yet // +// added + lock(); unsigned other_index; other_index = m_const_pool.get_ref_class_index(cp_index); unlock(); Index: working_vm/vm/vmcore/src/class_support/classloader.cpp =================================================================== --- working_vm/vm/vmcore/src/class_support/classloader.cpp (revision 631623) +++ working_vm/vm/vmcore/src/class_support/classloader.cpp (working copy) @@ -453,7 +453,7 @@ ClassLoader* ClassLoader::FindByObject(ManagedObject* loader) { - LMAutoUnlock aulock(&(ClassLoader::m_tableLock)); +// LMAutoUnlock aulock(&(ClassLoader::m_tableLock)); ClassLoader* cl; for(unsigned i = 0; i < m_nextEntry; i++) { @@ -632,11 +632,13 @@ VM_thread* cur_thread = get_thread_ptr(); while(true) { - LMAutoUnlock aulock(&m_lock); + // check if the class has been already recorded as initiated by this loader pklass = m_initiatedClasses->Lookup(className); if (pklass) return *pklass; + LMAutoUnlock aulock(&m_lock); + pklass = m_loadedClasses->Lookup(className); if(pklass) { @@ -1500,11 +1502,12 @@ // record class as initiated if (klass) { - LMAutoUnlock aulock(&m_lock); + // check if class has been already recorded as initiated by DefineClass() Class** pklass = m_initiatedClasses->Lookup(className); if (NULL == pklass) { + LMAutoUnlock aulock(&m_lock); m_initiatedClasses->Insert(className, klass); } else { assert(klass == *pklass);