changeset 54942:2523496f5107

8221967: InternTest.java timed out Summary: Move redundant table lookup and make rehashing be a needed guaranteed safepoint cleanup action. Reviewed-by: dholmes, rehn
author coleenp
date Mon, 20 May 2019 10:06:07 -0400
parents af28daff6b98
children 6cbb5c2255e3
files src/hotspot/share/classfile/stringTable.cpp src/hotspot/share/classfile/symbolTable.cpp src/hotspot/share/runtime/safepoint.cpp
diffstat 3 files changed, 16 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/hotspot/share/classfile/stringTable.cpp	Mon May 20 09:43:46 2019 -0400
+++ b/src/hotspot/share/classfile/stringTable.cpp	Mon May 20 10:06:07 2019 -0400
@@ -372,16 +372,19 @@
 
   bool rehash_warning;
   do {
-    if (_local_table->get(THREAD, lookup, stg, &rehash_warning)) {
-      update_needs_rehash(rehash_warning);
-      return stg.get_res_oop();
-    }
+    // Callers have already looked up the String using the jchar* name, so just go to add.
     WeakHandle<vm_string_table_data> wh = WeakHandle<vm_string_table_data>::create(string_h);
     // The hash table takes ownership of the WeakHandle, even if it's not inserted.
     if (_local_table->insert(THREAD, lookup, wh, &rehash_warning)) {
       update_needs_rehash(rehash_warning);
       return wh.resolve();
     }
+    // In case another thread did a concurrent add, return value already in the table.
+    // This could fail if the String got gc'ed concurrently, so loop back until success.
+    if (_local_table->get(THREAD, lookup, stg, &rehash_warning)) {
+      update_needs_rehash(rehash_warning);
+      return stg.get_res_oop();
+    }
   } while(true);
 }
 
--- a/src/hotspot/share/classfile/symbolTable.cpp	Mon May 20 09:43:46 2019 -0400
+++ b/src/hotspot/share/classfile/symbolTable.cpp	Mon May 20 10:06:07 2019 -0400
@@ -481,14 +481,17 @@
   Thread* THREAD = Thread::current();
 
   do {
+    // Callers have looked up the symbol once, insert the symbol.
+    sym = allocate_symbol(name, len, heap);
+    if (_local_table->insert(THREAD, lookup, sym, &rehash_warning, &clean_hint)) {
+      break;
+    }
+    // In case another thread did a concurrent add, return value already in the table.
+    // This could fail if the symbol got deleted concurrently, so loop back until success.
     if (_local_table->get(THREAD, lookup, stg, &rehash_warning)) {
       sym = stg.get_res_sym();
       break;
     }
-    sym = allocate_symbol(name, len, heap);
-    if (_local_table->insert(THREAD, lookup, sym, &rehash_warning, &clean_hint)) {
-      break;
-    }
   } while(true);
 
   update_needs_rehash(rehash_warning);
--- a/src/hotspot/share/runtime/safepoint.cpp	Mon May 20 09:43:46 2019 -0400
+++ b/src/hotspot/share/runtime/safepoint.cpp	Mon May 20 10:06:07 2019 -0400
@@ -516,6 +516,8 @@
   if (ObjectSynchronizer::is_cleanup_needed()) return true;
   // Need a safepoint if some inline cache buffers is non-empty
   if (!InlineCacheBuffer::is_empty()) return true;
+  if (StringTable::needs_rehashing()) return true;
+  if (SymbolTable::needs_rehashing()) return true;
   return false;
 }