1 /*
   2  * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "classfile/altHashing.hpp"
  27 #include "classfile/javaClasses.hpp"
  28 #include "classfile/symbolTable.hpp"
  29 #include "classfile/systemDictionary.hpp"
  30 #include "gc_interface/collectedHeap.inline.hpp"
  31 #include "memory/allocation.inline.hpp"
  32 #include "memory/filemap.hpp"
  33 #include "memory/gcLocker.inline.hpp"
  34 #include "oops/oop.inline.hpp"
  35 #include "oops/oop.inline2.hpp"
  36 #include "runtime/mutexLocker.hpp"
  37 #include "utilities/hashtable.inline.hpp"
  38 
  39 // --------------------------------------------------------------------------
  40 
  41 SymbolTable* SymbolTable::_the_table = NULL;
  42 // Static arena for symbols that are not deallocated
  43 Arena* SymbolTable::_arena = NULL;
  44 bool SymbolTable::_needs_rehashing = false;
  45 
  46 Symbol* SymbolTable::allocate_symbol(const u1* name, int len, bool c_heap, TRAPS) {
  47   assert (len <= Symbol::max_length(), "should be checked by caller");
  48 
  49   Symbol* sym;
  50 
  51   if (DumpSharedSpaces) {
  52     // Allocate all symbols to CLD shared metaspace
  53     sym = new (len, ClassLoaderData::the_null_class_loader_data(), THREAD) Symbol(name, len, -1);
  54   } else if (c_heap) {
  55     // refcount starts as 1
  56     sym = new (len, THREAD) Symbol(name, len, 1);
  57     assert(sym != NULL, "new should call vm_exit_out_of_memory if C_HEAP is exhausted");
  58   } else {
  59     // Allocate to global arena
  60     sym = new (len, arena(), THREAD) Symbol(name, len, -1);
  61   }
  62   return sym;
  63 }
  64 
  65 void SymbolTable::initialize_symbols(int arena_alloc_size) {
  66   // Initialize the arena for global symbols, size passed in depends on CDS.
  67   if (arena_alloc_size == 0) {
  68     _arena = new (mtSymbol) Arena();
  69   } else {
  70     _arena = new (mtSymbol) Arena(arena_alloc_size);
  71   }
  72 }
  73 
  74 // Call function for all symbols in the symbol table.
  75 void SymbolTable::symbols_do(SymbolClosure *cl) {
  76   const int n = the_table()->table_size();
  77   for (int i = 0; i < n; i++) {
  78     for (HashtableEntry<Symbol*, mtSymbol>* p = the_table()->bucket(i);
  79          p != NULL;
  80          p = p->next()) {
  81       cl->do_symbol(p->literal_addr());
  82     }
  83   }
  84 }
  85 
  86 int SymbolTable::symbols_removed = 0;
  87 int SymbolTable::symbols_counted = 0;
  88 
  89 // Remove unreferenced symbols from the symbol table
  90 // This is done late during GC.
  91 void SymbolTable::unlink() {
  92   int removed = 0;
  93   int total = 0;
  94   size_t memory_total = 0;
  95   for (int i = 0; i < the_table()->table_size(); ++i) {
  96     HashtableEntry<Symbol*, mtSymbol>** p = the_table()->bucket_addr(i);
  97     HashtableEntry<Symbol*, mtSymbol>* entry = the_table()->bucket(i);
  98     while (entry != NULL) {
  99       // Shared entries are normally at the end of the bucket and if we run into
 100       // a shared entry, then there is nothing more to remove. However, if we
 101       // have rehashed the table, then the shared entries are no longer at the
 102       // end of the bucket.
 103       if (entry->is_shared() && !use_alternate_hashcode()) {
 104         break;
 105       }
 106       Symbol* s = entry->literal();
 107       memory_total += s->size();
 108       total++;
 109       assert(s != NULL, "just checking");
 110       // If reference count is zero, remove.
 111       if (s->refcount() == 0) {
 112         assert(!entry->is_shared(), "shared entries should be kept live");
 113         delete s;
 114         removed++;
 115         *p = entry->next();
 116         the_table()->free_entry(entry);
 117       } else {
 118         p = entry->next_addr();
 119       }
 120       // get next entry
 121       entry = (HashtableEntry<Symbol*, mtSymbol>*)HashtableEntry<Symbol*, mtSymbol>::make_ptr(*p);
 122     }
 123   }
 124   symbols_removed += removed;
 125   symbols_counted += total;
 126   // Exclude printing for normal PrintGCDetails because people parse
 127   // this output.
 128   if (PrintGCDetails && Verbose && WizardMode) {
 129     gclog_or_tty->print(" [Symbols=%d size=" SIZE_FORMAT "K] ", total,
 130                         (memory_total*HeapWordSize)/1024);
 131   }
 132 }
 133 
 134 // Create a new table and using alternate hash code, populate the new table
 135 // with the existing strings.   Set flag to use the alternate hash code afterwards.
 136 void SymbolTable::rehash_table() {
 137   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
 138   // This should never happen with -Xshare:dump but it might in testing mode.
 139   if (DumpSharedSpaces) return;
 140   // Create a new symbol table
 141   SymbolTable* new_table = new SymbolTable();
 142 
 143   the_table()->move_to(new_table);
 144 
 145   // Delete the table and buckets (entries are reused in new table).
 146   delete _the_table;
 147   // Don't check if we need rehashing until the table gets unbalanced again.
 148   // Then rehash with a new global seed.
 149   _needs_rehashing = false;
 150   _the_table = new_table;
 151 }
 152 
 153 // Lookup a symbol in a bucket.
 154 
 155 Symbol* SymbolTable::lookup(int index, const char* name,
 156                               int len, unsigned int hash) {
 157   int count = 0;
 158   for (HashtableEntry<Symbol*, mtSymbol>* e = bucket(index); e != NULL; e = e->next()) {
 159     count++;  // count all entries in this bucket, not just ones with same hash
 160     if (e->hash() == hash) {
 161       Symbol* sym = e->literal();
 162       if (sym->equals(name, len)) {
 163         // something is referencing this symbol now.
 164         sym->increment_refcount();
 165         return sym;
 166       }
 167     }
 168   }
 169   // If the bucket size is too deep check if this hash code is insufficient.
 170   if (count >= BasicHashtable<mtSymbol>::rehash_count && !needs_rehashing()) {
 171     _needs_rehashing = check_rehash_table(count);
 172   }
 173   return NULL;
 174 }
 175 
 176 // Pick hashing algorithm.
 177 unsigned int SymbolTable::hash_symbol(const char* s, int len) {
 178   return use_alternate_hashcode() ?
 179            AltHashing::murmur3_32(seed(), (const jbyte*)s, len) :
 180            java_lang_String::hash_code(s, len);
 181 }
 182 
 183 
 184 // We take care not to be blocking while holding the
 185 // SymbolTable_lock. Otherwise, the system might deadlock, since the
 186 // symboltable is used during compilation (VM_thread) The lock free
 187 // synchronization is simplified by the fact that we do not delete
 188 // entries in the symbol table during normal execution (only during
 189 // safepoints).
 190 
 191 Symbol* SymbolTable::lookup(const char* name, int len, TRAPS) {
 192   unsigned int hashValue = hash_symbol(name, len);
 193   int index = the_table()->hash_to_index(hashValue);
 194 
 195   Symbol* s = the_table()->lookup(index, name, len, hashValue);
 196 
 197   // Found
 198   if (s != NULL) return s;
 199 
 200   // Grab SymbolTable_lock first.
 201   MutexLocker ml(SymbolTable_lock, THREAD);
 202 
 203   // Otherwise, add to symbol to table
 204   return the_table()->basic_add(index, (u1*)name, len, hashValue, true, CHECK_NULL);
 205 }
 206 
 207 Symbol* SymbolTable::lookup(const Symbol* sym, int begin, int end, TRAPS) {
 208   char* buffer;
 209   int index, len;
 210   unsigned int hashValue;
 211   char* name;
 212   {
 213     debug_only(No_Safepoint_Verifier nsv;)
 214 
 215     name = (char*)sym->base() + begin;
 216     len = end - begin;
 217     hashValue = hash_symbol(name, len);
 218     index = the_table()->hash_to_index(hashValue);
 219     Symbol* s = the_table()->lookup(index, name, len, hashValue);
 220 
 221     // Found
 222     if (s != NULL) return s;
 223   }
 224 
 225   // Otherwise, add to symbol to table. Copy to a C string first.
 226   char stack_buf[128];
 227   ResourceMark rm(THREAD);
 228   if (len <= 128) {
 229     buffer = stack_buf;
 230   } else {
 231     buffer = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len);
 232   }
 233   for (int i=0; i<len; i++) {
 234     buffer[i] = name[i];
 235   }
 236   // Make sure there is no safepoint in the code above since name can't move.
 237   // We can't include the code in No_Safepoint_Verifier because of the
 238   // ResourceMark.
 239 
 240   // Grab SymbolTable_lock first.
 241   MutexLocker ml(SymbolTable_lock, THREAD);
 242 
 243   return the_table()->basic_add(index, (u1*)buffer, len, hashValue, true, CHECK_NULL);
 244 }
 245 
 246 Symbol* SymbolTable::lookup_only(const char* name, int len,
 247                                    unsigned int& hash) {
 248   hash = hash_symbol(name, len);
 249   int index = the_table()->hash_to_index(hash);
 250 
 251   Symbol* s = the_table()->lookup(index, name, len, hash);
 252   return s;
 253 }
 254 
 255 // Look up the address of the literal in the SymbolTable for this Symbol*
 256 // Do not create any new symbols
 257 // Do not increment the reference count to keep this alive
 258 Symbol** SymbolTable::lookup_symbol_addr(Symbol* sym){
 259   unsigned int hash = hash_symbol((char*)sym->bytes(), sym->utf8_length());
 260   int index = the_table()->hash_to_index(hash);
 261 
 262   for (HashtableEntry<Symbol*, mtSymbol>* e = the_table()->bucket(index); e != NULL; e = e->next()) {
 263     if (e->hash() == hash) {
 264       Symbol* literal_sym = e->literal();
 265       if (sym == literal_sym) {
 266         return e->literal_addr();
 267       }
 268     }
 269   }
 270   return NULL;
 271 }
 272 
 273 // Suggestion: Push unicode-based lookup all the way into the hashing
 274 // and probing logic, so there is no need for convert_to_utf8 until
 275 // an actual new Symbol* is created.
 276 Symbol* SymbolTable::lookup_unicode(const jchar* name, int utf16_length, TRAPS) {
 277   int utf8_length = UNICODE::utf8_length((jchar*) name, utf16_length);
 278   char stack_buf[128];
 279   if (utf8_length < (int) sizeof(stack_buf)) {
 280     char* chars = stack_buf;
 281     UNICODE::convert_to_utf8(name, utf16_length, chars);
 282     return lookup(chars, utf8_length, THREAD);
 283   } else {
 284     ResourceMark rm(THREAD);
 285     char* chars = NEW_RESOURCE_ARRAY(char, utf8_length + 1);;
 286     UNICODE::convert_to_utf8(name, utf16_length, chars);
 287     return lookup(chars, utf8_length, THREAD);
 288   }
 289 }
 290 
 291 Symbol* SymbolTable::lookup_only_unicode(const jchar* name, int utf16_length,
 292                                            unsigned int& hash) {
 293   int utf8_length = UNICODE::utf8_length((jchar*) name, utf16_length);
 294   char stack_buf[128];
 295   if (utf8_length < (int) sizeof(stack_buf)) {
 296     char* chars = stack_buf;
 297     UNICODE::convert_to_utf8(name, utf16_length, chars);
 298     return lookup_only(chars, utf8_length, hash);
 299   } else {
 300     ResourceMark rm;
 301     char* chars = NEW_RESOURCE_ARRAY(char, utf8_length + 1);;
 302     UNICODE::convert_to_utf8(name, utf16_length, chars);
 303     return lookup_only(chars, utf8_length, hash);
 304   }
 305 }
 306 
 307 void SymbolTable::add(ClassLoaderData* loader_data, constantPoolHandle cp,
 308                       int names_count,
 309                       const char** names, int* lengths, int* cp_indices,
 310                       unsigned int* hashValues, TRAPS) {
 311   // Grab SymbolTable_lock first.
 312   MutexLocker ml(SymbolTable_lock, THREAD);
 313 
 314   SymbolTable* table = the_table();
 315   bool added = table->basic_add(loader_data, cp, names_count, names, lengths,
 316                                 cp_indices, hashValues, CHECK);
 317   if (!added) {
 318     // do it the hard way
 319     for (int i=0; i<names_count; i++) {
 320       int index = table->hash_to_index(hashValues[i]);
 321       bool c_heap = !loader_data->is_the_null_class_loader_data();
 322       Symbol* sym = table->basic_add(index, (u1*)names[i], lengths[i], hashValues[i], c_heap, CHECK);
 323       cp->symbol_at_put(cp_indices[i], sym);
 324     }
 325   }
 326 }
 327 
 328 Symbol* SymbolTable::new_permanent_symbol(const char* name, TRAPS) {
 329   unsigned int hash;
 330   Symbol* result = SymbolTable::lookup_only((char*)name, (int)strlen(name), hash);
 331   if (result != NULL) {
 332     return result;
 333   }
 334   // Grab SymbolTable_lock first.
 335   MutexLocker ml(SymbolTable_lock, THREAD);
 336 
 337   SymbolTable* table = the_table();
 338   int index = table->hash_to_index(hash);
 339   return table->basic_add(index, (u1*)name, (int)strlen(name), hash, false, THREAD);
 340 }
 341 
 342 Symbol* SymbolTable::basic_add(int index_arg, u1 *name, int len,
 343                                unsigned int hashValue_arg, bool c_heap, TRAPS) {
 344   assert(!Universe::heap()->is_in_reserved(name) || GC_locker::is_active(),
 345          "proposed name of symbol must be stable");
 346 
 347   // Don't allow symbols to be created which cannot fit in a Symbol*.
 348   if (len > Symbol::max_length()) {
 349     THROW_MSG_0(vmSymbols::java_lang_InternalError(),
 350                 "name is too long to represent");
 351   }
 352 
 353   // Cannot hit a safepoint in this function because the "this" pointer can move.
 354   No_Safepoint_Verifier nsv;
 355 
 356   // Check if the symbol table has been rehashed, if so, need to recalculate
 357   // the hash value and index.
 358   unsigned int hashValue;
 359   int index;
 360   if (use_alternate_hashcode()) {
 361     hashValue = hash_symbol((const char*)name, len);
 362     index = hash_to_index(hashValue);
 363   } else {
 364     hashValue = hashValue_arg;
 365     index = index_arg;
 366   }
 367 
 368   // Since look-up was done lock-free, we need to check if another
 369   // thread beat us in the race to insert the symbol.
 370   Symbol* test = lookup(index, (char*)name, len, hashValue);
 371   if (test != NULL) {
 372     // A race occurred and another thread introduced the symbol.
 373     assert(test->refcount() != 0, "lookup should have incremented the count");
 374     return test;
 375   }
 376 
 377   // Create a new symbol.
 378   Symbol* sym = allocate_symbol(name, len, c_heap, CHECK_NULL);
 379   assert(sym->equals((char*)name, len), "symbol must be properly initialized");
 380 
 381   HashtableEntry<Symbol*, mtSymbol>* entry = new_entry(hashValue, sym);
 382   add_entry(index, entry);
 383   return sym;
 384 }
 385 
 386 // This version of basic_add adds symbols in batch from the constant pool
 387 // parsing.
 388 bool SymbolTable::basic_add(ClassLoaderData* loader_data, constantPoolHandle cp,
 389                             int names_count,
 390                             const char** names, int* lengths,
 391                             int* cp_indices, unsigned int* hashValues,
 392                             TRAPS) {
 393 
 394   // Check symbol names are not too long.  If any are too long, don't add any.
 395   for (int i = 0; i< names_count; i++) {
 396     if (lengths[i] > Symbol::max_length()) {
 397       THROW_MSG_0(vmSymbols::java_lang_InternalError(),
 398                   "name is too long to represent");
 399     }
 400   }
 401 
 402   // Cannot hit a safepoint in this function because the "this" pointer can move.
 403   No_Safepoint_Verifier nsv;
 404 
 405   for (int i=0; i<names_count; i++) {
 406     // Check if the symbol table has been rehashed, if so, need to recalculate
 407     // the hash value.
 408     unsigned int hashValue;
 409     if (use_alternate_hashcode()) {
 410       hashValue = hash_symbol(names[i], lengths[i]);
 411     } else {
 412       hashValue = hashValues[i];
 413     }
 414     // Since look-up was done lock-free, we need to check if another
 415     // thread beat us in the race to insert the symbol.
 416     int index = hash_to_index(hashValue);
 417     Symbol* test = lookup(index, names[i], lengths[i], hashValue);
 418     if (test != NULL) {
 419       // A race occurred and another thread introduced the symbol, this one
 420       // will be dropped and collected. Use test instead.
 421       cp->symbol_at_put(cp_indices[i], test);
 422       assert(test->refcount() != 0, "lookup should have incremented the count");
 423     } else {
 424       // Create a new symbol.  The null class loader is never unloaded so these
 425       // are allocated specially in a permanent arena.
 426       bool c_heap = !loader_data->is_the_null_class_loader_data();
 427       Symbol* sym = allocate_symbol((const u1*)names[i], lengths[i], c_heap, CHECK_(false));
 428       assert(sym->equals(names[i], lengths[i]), "symbol must be properly initialized");  // why wouldn't it be???
 429       HashtableEntry<Symbol*, mtSymbol>* entry = new_entry(hashValue, sym);
 430       add_entry(index, entry);
 431       cp->symbol_at_put(cp_indices[i], sym);
 432     }
 433   }
 434   return true;
 435 }
 436 
 437 
 438 void SymbolTable::verify() {
 439   for (int i = 0; i < the_table()->table_size(); ++i) {
 440     HashtableEntry<Symbol*, mtSymbol>* p = the_table()->bucket(i);
 441     for ( ; p != NULL; p = p->next()) {
 442       Symbol* s = (Symbol*)(p->literal());
 443       guarantee(s != NULL, "symbol is NULL");
 444       unsigned int h = hash_symbol((char*)s->bytes(), s->utf8_length());
 445       guarantee(p->hash() == h, "broken hash in symbol table entry");
 446       guarantee(the_table()->hash_to_index(h) == i,
 447                 "wrong index in symbol table");
 448     }
 449   }
 450 }
 451 
 452 void SymbolTable::dump(outputStream* st) {
 453   the_table()->dump_table(st, "SymbolTable");
 454 }
 455 
 456 
 457 //---------------------------------------------------------------------------
 458 // Non-product code
 459 
 460 #ifndef PRODUCT
 461 
 462 void SymbolTable::print_histogram() {
 463   MutexLocker ml(SymbolTable_lock);
 464   const int results_length = 100;
 465   int results[results_length];
 466   int i,j;
 467 
 468   // initialize results to zero
 469   for (j = 0; j < results_length; j++) {
 470     results[j] = 0;
 471   }
 472 
 473   int total = 0;
 474   int max_symbols = 0;
 475   int out_of_range = 0;
 476   int memory_total = 0;
 477   int count = 0;
 478   for (i = 0; i < the_table()->table_size(); i++) {
 479     HashtableEntry<Symbol*, mtSymbol>* p = the_table()->bucket(i);
 480     for ( ; p != NULL; p = p->next()) {
 481       memory_total += p->literal()->size();
 482       count++;
 483       int counter = p->literal()->utf8_length();
 484       total += counter;
 485       if (counter < results_length) {
 486         results[counter]++;
 487       } else {
 488         out_of_range++;
 489       }
 490       max_symbols = MAX2(max_symbols, counter);
 491     }
 492   }
 493   tty->print_cr("Symbol Table:");
 494   tty->print_cr("Total number of symbols  %5d", count);
 495   tty->print_cr("Total size in memory     %5dK",
 496           (memory_total*HeapWordSize)/1024);
 497   tty->print_cr("Total counted            %5d", symbols_counted);
 498   tty->print_cr("Total removed            %5d", symbols_removed);
 499   if (symbols_counted > 0) {
 500     tty->print_cr("Percent removed          %3.2f",
 501           ((float)symbols_removed/(float)symbols_counted)* 100);
 502   }
 503   tty->print_cr("Reference counts         %5d", Symbol::_total_count);
 504   tty->print_cr("Symbol arena size        %5d used %5d",
 505                  arena()->size_in_bytes(), arena()->used());
 506   tty->print_cr("Histogram of symbol length:");
 507   tty->print_cr("%8s %5d", "Total  ", total);
 508   tty->print_cr("%8s %5d", "Maximum", max_symbols);
 509   tty->print_cr("%8s %3.2f", "Average",
 510           ((float) total / (float) the_table()->table_size()));
 511   tty->print_cr("%s", "Histogram:");
 512   tty->print_cr(" %s %29s", "Length", "Number chains that length");
 513   for (i = 0; i < results_length; i++) {
 514     if (results[i] > 0) {
 515       tty->print_cr("%6d %10d", i, results[i]);
 516     }
 517   }
 518   if (Verbose) {
 519     int line_length = 70;
 520     tty->print_cr("%s %30s", " Length", "Number chains that length");
 521     for (i = 0; i < results_length; i++) {
 522       if (results[i] > 0) {
 523         tty->print("%4d", i);
 524         for (j = 0; (j < results[i]) && (j < line_length);  j++) {
 525           tty->print("%1s", "*");
 526         }
 527         if (j == line_length) {
 528           tty->print("%1s", "+");
 529         }
 530         tty->cr();
 531       }
 532     }
 533   }
 534   tty->print_cr(" %s %d: %d\n", "Number chains longer than",
 535                     results_length, out_of_range);
 536 }
 537 
 538 void SymbolTable::print() {
 539   for (int i = 0; i < the_table()->table_size(); ++i) {
 540     HashtableEntry<Symbol*, mtSymbol>** p = the_table()->bucket_addr(i);
 541     HashtableEntry<Symbol*, mtSymbol>* entry = the_table()->bucket(i);
 542     if (entry != NULL) {
 543       while (entry != NULL) {
 544         tty->print(PTR_FORMAT " ", entry->literal());
 545         entry->literal()->print();
 546         tty->print(" %d", entry->literal()->refcount());
 547         p = entry->next_addr();
 548         entry = (HashtableEntry<Symbol*, mtSymbol>*)HashtableEntry<Symbol*, mtSymbol>::make_ptr(*p);
 549       }
 550       tty->cr();
 551     }
 552   }
 553 }
 554 #endif // PRODUCT
 555 
 556 // --------------------------------------------------------------------------
 557 
 558 #ifdef ASSERT
 559 class StableMemoryChecker : public StackObj {
 560   enum { _bufsize = wordSize*4 };
 561 
 562   address _region;
 563   jint    _size;
 564   u1      _save_buf[_bufsize];
 565 
 566   int sample(u1* save_buf) {
 567     if (_size <= _bufsize) {
 568       memcpy(save_buf, _region, _size);
 569       return _size;
 570     } else {
 571       // copy head and tail
 572       memcpy(&save_buf[0],          _region,                      _bufsize/2);
 573       memcpy(&save_buf[_bufsize/2], _region + _size - _bufsize/2, _bufsize/2);
 574       return (_bufsize/2)*2;
 575     }
 576   }
 577 
 578  public:
 579   StableMemoryChecker(const void* region, jint size) {
 580     _region = (address) region;
 581     _size   = size;
 582     sample(_save_buf);
 583   }
 584 
 585   bool verify() {
 586     u1 check_buf[sizeof(_save_buf)];
 587     int check_size = sample(check_buf);
 588     return (0 == memcmp(_save_buf, check_buf, check_size));
 589   }
 590 
 591   void set_region(const void* region) { _region = (address) region; }
 592 };
 593 #endif
 594 
 595 
 596 // --------------------------------------------------------------------------
 597 StringTable* StringTable::_the_table = NULL;
 598 
 599 bool StringTable::_needs_rehashing = false;
 600 
 601 // Pick hashing algorithm
 602 unsigned int StringTable::hash_string(const jchar* s, int len) {
 603   return use_alternate_hashcode() ? AltHashing::murmur3_32(seed(), s, len) :
 604                                     java_lang_String::hash_code(s, len);
 605 }
 606 
 607 oop StringTable::lookup(int index, jchar* name,
 608                         int len, unsigned int hash) {
 609   int count = 0;
 610   for (HashtableEntry<oop, mtSymbol>* l = bucket(index); l != NULL; l = l->next()) {
 611     count++;
 612     if (l->hash() == hash) {
 613       if (java_lang_String::equals(l->literal(), name, len)) {
 614         return l->literal();
 615       }
 616     }
 617   }
 618   // If the bucket size is too deep check if this hash code is insufficient.
 619   if (count >= BasicHashtable<mtSymbol>::rehash_count && !needs_rehashing()) {
 620     _needs_rehashing = check_rehash_table(count);
 621   }
 622   return NULL;
 623 }
 624 
 625 
 626 oop StringTable::basic_add(int index_arg, Handle string, jchar* name,
 627                            int len, unsigned int hashValue_arg, TRAPS) {
 628 
 629   assert(java_lang_String::equals(string(), name, len),
 630          "string must be properly initialized");
 631   // Cannot hit a safepoint in this function because the "this" pointer can move.
 632   No_Safepoint_Verifier nsv;
 633 
 634   // Check if the symbol table has been rehashed, if so, need to recalculate
 635   // the hash value and index before second lookup.
 636   unsigned int hashValue;
 637   int index;
 638   if (use_alternate_hashcode()) {
 639     hashValue = hash_string(name, len);
 640     index = hash_to_index(hashValue);
 641   } else {
 642     hashValue = hashValue_arg;
 643     index = index_arg;
 644   }
 645 
 646   // Since look-up was done lock-free, we need to check if another
 647   // thread beat us in the race to insert the symbol.
 648 
 649   oop test = lookup(index, name, len, hashValue); // calls lookup(u1*, int)
 650   if (test != NULL) {
 651     // Entry already added
 652     return test;
 653   }
 654 
 655   HashtableEntry<oop, mtSymbol>* entry = new_entry(hashValue, string());
 656   add_entry(index, entry);
 657   return string();
 658 }
 659 
 660 
 661 oop StringTable::lookup(Symbol* symbol) {
 662   ResourceMark rm;
 663   int length;
 664   jchar* chars = symbol->as_unicode(length);
 665   return lookup(chars, length);
 666 }
 667 
 668 
 669 oop StringTable::lookup(jchar* name, int len) {
 670   unsigned int hash = hash_string(name, len);
 671   int index = the_table()->hash_to_index(hash);
 672   return the_table()->lookup(index, name, len, hash);
 673 }
 674 
 675 
 676 oop StringTable::intern(Handle string_or_null, jchar* name,
 677                         int len, TRAPS) {
 678   unsigned int hashValue = hash_string(name, len);
 679   int index = the_table()->hash_to_index(hashValue);
 680   oop found_string = the_table()->lookup(index, name, len, hashValue);
 681 
 682   // Found
 683   if (found_string != NULL) return found_string;
 684 
 685   debug_only(StableMemoryChecker smc(name, len * sizeof(name[0])));
 686   assert(!Universe::heap()->is_in_reserved(name) || GC_locker::is_active(),
 687          "proposed name of symbol must be stable");
 688 
 689   Handle string;
 690   // try to reuse the string if possible
 691   if (!string_or_null.is_null()) {
 692     string = string_or_null;
 693   } else {
 694     string = java_lang_String::create_from_unicode(name, len, CHECK_NULL);
 695   }
 696 
 697   // Grab the StringTable_lock before getting the_table() because it could
 698   // change at safepoint.
 699   MutexLocker ml(StringTable_lock, THREAD);
 700 
 701   // Otherwise, add to symbol to table
 702   return the_table()->basic_add(index, string, name, len,
 703                                 hashValue, CHECK_NULL);
 704 }
 705 
 706 oop StringTable::intern(Symbol* symbol, TRAPS) {
 707   if (symbol == NULL) return NULL;
 708   ResourceMark rm(THREAD);
 709   int length;
 710   jchar* chars = symbol->as_unicode(length);
 711   Handle string;
 712   oop result = intern(string, chars, length, CHECK_NULL);
 713   return result;
 714 }
 715 
 716 
 717 oop StringTable::intern(oop string, TRAPS)
 718 {
 719   if (string == NULL) return NULL;
 720   ResourceMark rm(THREAD);
 721   int length;
 722   Handle h_string (THREAD, string);
 723   jchar* chars = java_lang_String::as_unicode_string(string, length, CHECK_NULL);
 724   oop result = intern(h_string, chars, length, CHECK_NULL);
 725   return result;
 726 }
 727 
 728 
 729 oop StringTable::intern(const char* utf8_string, TRAPS) {
 730   if (utf8_string == NULL) return NULL;
 731   ResourceMark rm(THREAD);
 732   int length = UTF8::unicode_length(utf8_string);
 733   jchar* chars = NEW_RESOURCE_ARRAY(jchar, length);
 734   UTF8::convert_to_unicode(utf8_string, chars, length);
 735   Handle string;
 736   oop result = intern(string, chars, length, CHECK_NULL);
 737   return result;
 738 }
 739 
 740 void StringTable::unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* f) {
 741   // Readers of the table are unlocked, so we should only be removing
 742   // entries at a safepoint.
 743   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
 744   for (int i = 0; i < the_table()->table_size(); ++i) {
 745     HashtableEntry<oop, mtSymbol>** p = the_table()->bucket_addr(i);
 746     HashtableEntry<oop, mtSymbol>* entry = the_table()->bucket(i);
 747     while (entry != NULL) {
 748       assert(!entry->is_shared(), "CDS not used for the StringTable");
 749 
 750       if (is_alive->do_object_b(entry->literal())) {
 751         if (f != NULL) {
 752           f->do_oop((oop*)entry->literal_addr());
 753         }
 754         p = entry->next_addr();
 755       } else {
 756         *p = entry->next();
 757         the_table()->free_entry(entry);
 758       }
 759       entry = *p;
 760     }
 761   }
 762 }
 763 
 764 void StringTable::oops_do(OopClosure* f) {
 765   for (int i = 0; i < the_table()->table_size(); ++i) {
 766     HashtableEntry<oop, mtSymbol>* entry = the_table()->bucket(i);
 767     while (entry != NULL) {
 768       assert(!entry->is_shared(), "CDS not used for the StringTable");
 769 
 770       f->do_oop((oop*)entry->literal_addr());
 771 
 772       entry = entry->next();
 773     }
 774   }
 775 }
 776 
 777 void StringTable::verify() {
 778   for (int i = 0; i < the_table()->table_size(); ++i) {
 779     HashtableEntry<oop, mtSymbol>* p = the_table()->bucket(i);
 780     for ( ; p != NULL; p = p->next()) {
 781       oop s = p->literal();
 782       guarantee(s != NULL, "interned string is NULL");
 783       unsigned int h = java_lang_String::hash_string(s);
 784       guarantee(p->hash() == h, "broken hash in string table entry");
 785       guarantee(the_table()->hash_to_index(h) == i,
 786                 "wrong index in string table");
 787     }
 788   }
 789 }
 790 
 791 void StringTable::dump(outputStream* st) {
 792   the_table()->dump_table(st, "StringTable");
 793 }
 794 
 795 
 796 // Create a new table and using alternate hash code, populate the new table
 797 // with the existing strings.   Set flag to use the alternate hash code afterwards.
 798 void StringTable::rehash_table() {
 799   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
 800   // This should never happen with -Xshare:dump but it might in testing mode.
 801   if (DumpSharedSpaces) return;
 802   StringTable* new_table = new StringTable();
 803 
 804   // Rehash the table
 805   the_table()->move_to(new_table);
 806 
 807   // Delete the table and buckets (entries are reused in new table).
 808   delete _the_table;
 809   // Don't check if we need rehashing until the table gets unbalanced again.
 810   // Then rehash with a new global seed.
 811   _needs_rehashing = false;
 812   _the_table = new_table;
 813 }