src/share/vm/classfile/stringTable.cpp

Print this page

        

*** 35,44 **** --- 35,45 ---- #include "oops/oop.inline2.hpp" #include "runtime/atomic.inline.hpp" #include "runtime/mutexLocker.hpp" #include "utilities/hashtable.inline.hpp" #if INCLUDE_ALL_GCS + #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp" #include "gc_implementation/g1/g1StringDedup.hpp" #endif PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
*** 155,180 **** int length; jchar* chars = symbol->as_unicode(length); return lookup(chars, length); } oop StringTable::lookup(jchar* name, int len) { unsigned int hash = hash_string(name, len); int index = the_table()->hash_to_index(hash); ! return the_table()->lookup(index, name, len, hash); } oop StringTable::intern(Handle string_or_null, jchar* name, int len, TRAPS) { unsigned int hashValue = hash_string(name, len); int index = the_table()->hash_to_index(hashValue); oop found_string = the_table()->lookup(index, name, len, hashValue); // Found ! if (found_string != NULL) return found_string; debug_only(StableMemoryChecker smc(name, len * sizeof(name[0]))); assert(!Universe::heap()->is_in_reserved(name), "proposed name of symbol must be stable"); --- 156,199 ---- int length; jchar* chars = symbol->as_unicode(length); return lookup(chars, length); } + // Tell the GC that this string was looked up in the StringTable. + static void ensure_string_alive(oop string) { + // A lookup in the StringTable could return an object that was previously + // considered dead. The SATB part of G1 needs to get notified about this + // potential resurrection, otherwise the marking might not find the object. + #if INCLUDE_ALL_GCS + if (UseG1GC && string != NULL) { + G1SATBCardTableModRefBS::enqueue(string); + } + #endif + } oop StringTable::lookup(jchar* name, int len) { unsigned int hash = hash_string(name, len); int index = the_table()->hash_to_index(hash); ! oop string = the_table()->lookup(index, name, len, hash); ! ! ensure_string_alive(string); ! ! return string; } oop StringTable::intern(Handle string_or_null, jchar* name, int len, TRAPS) { unsigned int hashValue = hash_string(name, len); int index = the_table()->hash_to_index(hashValue); oop found_string = the_table()->lookup(index, name, len, hashValue); // Found ! if (found_string != NULL) { ! ensure_string_alive(found_string); ! return found_string; ! } debug_only(StableMemoryChecker smc(name, len * sizeof(name[0]))); assert(!Universe::heap()->is_in_reserved(name), "proposed name of symbol must be stable");
*** 195,209 **** } #endif // Grab the StringTable_lock before getting the_table() because it could // change at safepoint. MutexLocker ml(StringTable_lock, THREAD); - // Otherwise, add to symbol to table ! return the_table()->basic_add(index, string, name, len, hashValue, CHECK_NULL); } oop StringTable::intern(Symbol* symbol, TRAPS) { if (symbol == NULL) return NULL; ResourceMark rm(THREAD); --- 214,234 ---- } #endif // Grab the StringTable_lock before getting the_table() because it could // change at safepoint. + oop added_or_found; + { MutexLocker ml(StringTable_lock, THREAD); // Otherwise, add to symbol to table ! added_or_found = the_table()->basic_add(index, string, name, len, hashValue, CHECK_NULL); + } + + ensure_string_alive(added_or_found); + + return added_or_found; } oop StringTable::intern(Symbol* symbol, TRAPS) { if (symbol == NULL) return NULL; ResourceMark rm(THREAD);