changeset 1258:38836cf1d8d2

6920977: G1: guarantee(k == probe->klass(),"klass should be in dictionary") fails Summary: the guarantee is too strict and the test will fail (incorrectly) if the class is not in the system dictionary but in the placeholders. Reviewed-by: acorn, phh
author tonyp
date Fri, 05 Feb 2010 11:05:50 -0500
parents 230fac611b50
children 9eee977dd1a9
files src/share/vm/classfile/loaderConstraints.cpp src/share/vm/classfile/loaderConstraints.hpp src/share/vm/classfile/systemDictionary.cpp src/share/vm/includeDB_core
diffstat 4 files changed, 22 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/classfile/loaderConstraints.cpp	Mon Feb 08 09:58:32 2010 -0800
+++ b/src/share/vm/classfile/loaderConstraints.cpp	Fri Feb 05 11:05:50 2010 -0500
@@ -457,7 +457,8 @@
 }
 
 
-void LoaderConstraintTable::verify(Dictionary* dictionary) {
+void LoaderConstraintTable::verify(Dictionary* dictionary,
+                                   PlaceholderTable* placeholders) {
   Thread *thread = Thread::current();
   for (int cindex = 0; cindex < _loader_constraint_size; cindex++) {
     for (LoaderConstraintEntry* probe = bucket(cindex);
@@ -472,7 +473,23 @@
         unsigned int d_hash = dictionary->compute_hash(name, loader);
         int d_index = dictionary->hash_to_index(d_hash);
         klassOop k = dictionary->find_class(d_index, d_hash, name, loader);
-        guarantee(k == probe->klass(), "klass should be in dictionary");
+        if (k != NULL) {
+          // We found the class in the system dictionary, so we should
+          // make sure that the klassOop matches what we already have.
+          guarantee(k == probe->klass(), "klass should be in dictionary");
+        } else {
+          // If we don't find the class in the system dictionary, it
+          // has to be in the placeholders table.
+          unsigned int p_hash = placeholders->compute_hash(name, loader);
+          int p_index = placeholders->hash_to_index(p_hash);
+          PlaceholderEntry* entry = placeholders->get_entry(p_index, p_hash,
+                                                            name, loader);
+
+          // The instanceKlass might not be on the entry, so the only
+          // thing we can check here is whether we were successful in
+          // finding the class in the placeholders table.
+          guarantee(entry != NULL, "klass should be in the placeholders");
+        }
       }
       for (int n = 0; n< probe->num_loaders(); n++) {
         guarantee(probe->loader(n)->is_oop_or_null(), "should be oop");
--- a/src/share/vm/classfile/loaderConstraints.hpp	Mon Feb 08 09:58:32 2010 -0800
+++ b/src/share/vm/classfile/loaderConstraints.hpp	Fri Feb 05 11:05:50 2010 -0500
@@ -84,7 +84,7 @@
 
   void purge_loader_constraints(BoolObjectClosure* is_alive);
 
-  void verify(Dictionary* dictionary);
+  void verify(Dictionary* dictionary, PlaceholderTable* placeholders);
 #ifndef PRODUCT
   void print();
 #endif
--- a/src/share/vm/classfile/systemDictionary.cpp	Mon Feb 08 09:58:32 2010 -0800
+++ b/src/share/vm/classfile/systemDictionary.cpp	Fri Feb 05 11:05:50 2010 -0500
@@ -2573,7 +2573,7 @@
 
   // Verify constraint table
   guarantee(constraints() != NULL, "Verify of loader constraints failed");
-  constraints()->verify(dictionary());
+  constraints()->verify(dictionary(), placeholders());
 }
 
 
--- a/src/share/vm/includeDB_core	Mon Feb 08 09:58:32 2010 -0800
+++ b/src/share/vm/includeDB_core	Fri Feb 05 11:05:50 2010 -0500
@@ -2654,6 +2654,7 @@
 loaderConstraints.cpp                   safepoint.hpp
 
 loaderConstraints.hpp                   dictionary.hpp
+loaderConstraints.hpp                   placeholders.hpp
 loaderConstraints.hpp                   hashtable.hpp
 
 location.cpp                            debugInfo.hpp