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);