src/hotspot/share/classfile/stringTable.cpp
changeset 52717 b22da519f2e3
parent 52516 d5eebe1e03fe
child 52931 3b0fe3d6c3d7
equal deleted inserted replaced
52716:877dd2b0f36c 52717:b22da519f2e3
   204   log_trace(stringtable)("Start size: " SIZE_FORMAT " (" SIZE_FORMAT ")",
   204   log_trace(stringtable)("Start size: " SIZE_FORMAT " (" SIZE_FORMAT ")",
   205                          _current_size, start_size_log_2);
   205                          _current_size, start_size_log_2);
   206   _local_table = new StringTableHash(start_size_log_2, END_SIZE, REHASH_LEN);
   206   _local_table = new StringTableHash(start_size_log_2, END_SIZE, REHASH_LEN);
   207 }
   207 }
   208 
   208 
       
   209 void StringTable::update_needs_rehash(bool rehash) {
       
   210   if (rehash) {
       
   211     _needs_rehashing = true;
       
   212   }
       
   213 }
       
   214 
   209 size_t StringTable::item_added() {
   215 size_t StringTable::item_added() {
   210   return Atomic::add((size_t)1, &(the_table()->_items_count));
   216   return Atomic::add((size_t)1, &(the_table()->_items_count));
   211 }
   217 }
   212 
   218 
   213 size_t StringTable::add_items_count_to_clean(size_t ndead) {
   219 size_t StringTable::add_items_count_to_clean(size_t ndead) {
   279   Thread* thread = Thread::current();
   285   Thread* thread = Thread::current();
   280   StringTableLookupJchar lookup(thread, hash, name, len);
   286   StringTableLookupJchar lookup(thread, hash, name, len);
   281   StringTableGet stg(thread);
   287   StringTableGet stg(thread);
   282   bool rehash_warning;
   288   bool rehash_warning;
   283   _local_table->get(thread, lookup, stg, &rehash_warning);
   289   _local_table->get(thread, lookup, stg, &rehash_warning);
   284   if (rehash_warning) {
   290   update_needs_rehash(rehash_warning);
   285     _needs_rehashing = true;
       
   286   }
       
   287   return stg.get_res_oop();
   291   return stg.get_res_oop();
   288 }
   292 }
   289 
   293 
   290 // Interning
   294 // Interning
   291 oop StringTable::intern(Symbol* symbol, TRAPS) {
   295 oop StringTable::intern(Symbol* symbol, TRAPS) {
   332   }
   336   }
   333   return StringTable::the_table()->do_intern(string_or_null_h, name, len,
   337   return StringTable::the_table()->do_intern(string_or_null_h, name, len,
   334                                              hash, CHECK_NULL);
   338                                              hash, CHECK_NULL);
   335 }
   339 }
   336 
   340 
   337 class StringTableCreateEntry : public StackObj {
       
   338  private:
       
   339    Thread* _thread;
       
   340    Handle  _return;
       
   341    Handle  _store;
       
   342  public:
       
   343   StringTableCreateEntry(Thread* thread, Handle store)
       
   344     : _thread(thread), _store(store) {}
       
   345 
       
   346   WeakHandle<vm_string_table_data> operator()() { // No dups found
       
   347     WeakHandle<vm_string_table_data> wh =
       
   348       WeakHandle<vm_string_table_data>::create(_store);
       
   349     return wh;
       
   350   }
       
   351   void operator()(bool inserted, WeakHandle<vm_string_table_data>* val) {
       
   352     oop result = val->resolve();
       
   353     assert(result != NULL, "Result should be reachable");
       
   354     _return = Handle(_thread, result);
       
   355   }
       
   356   oop get_return() const {
       
   357     return _return();
       
   358   }
       
   359 };
       
   360 
       
   361 oop StringTable::do_intern(Handle string_or_null_h, const jchar* name,
   341 oop StringTable::do_intern(Handle string_or_null_h, const jchar* name,
   362                            int len, uintx hash, TRAPS) {
   342                            int len, uintx hash, TRAPS) {
   363   HandleMark hm(THREAD);  // cleanup strings created
   343   HandleMark hm(THREAD);  // cleanup strings created
   364   Handle string_h;
   344   Handle string_h;
   365 
   345 
   375   Universe::heap()->deduplicate_string(string_h());
   355   Universe::heap()->deduplicate_string(string_h());
   376 
   356 
   377   assert(java_lang_String::equals(string_h(), name, len),
   357   assert(java_lang_String::equals(string_h(), name, len),
   378          "string must be properly initialized");
   358          "string must be properly initialized");
   379   assert(len == java_lang_String::length(string_h()), "Must be same length");
   359   assert(len == java_lang_String::length(string_h()), "Must be same length");
       
   360 
   380   StringTableLookupOop lookup(THREAD, hash, string_h);
   361   StringTableLookupOop lookup(THREAD, hash, string_h);
   381   StringTableCreateEntry stc(THREAD, string_h);
   362   StringTableGet stg(THREAD);
   382 
   363 
   383   bool rehash_warning;
   364   bool rehash_warning;
   384   _local_table->get_insert_lazy(THREAD, lookup, stc, stc, &rehash_warning);
   365   do {
   385   if (rehash_warning) {
   366     if (_local_table->get(THREAD, lookup, stg, &rehash_warning)) {
   386     _needs_rehashing = true;
   367       update_needs_rehash(rehash_warning);
   387   }
   368       return stg.get_res_oop();
   388   return stc.get_return();
   369     }
       
   370     WeakHandle<vm_string_table_data> wh = WeakHandle<vm_string_table_data>::create(string_h);
       
   371     // The hash table takes ownership of the WeakHandle, even if it's not inserted.
       
   372     if (_local_table->insert(THREAD, lookup, wh, &rehash_warning)) {
       
   373       update_needs_rehash(rehash_warning);
       
   374       return wh.resolve();
       
   375     }
       
   376   } while(true);
   389 }
   377 }
   390 
   378 
   391 // GC support
   379 // GC support
   392 class StringTableIsAliveCounter : public BoolObjectClosure {
   380 class StringTableIsAliveCounter : public BoolObjectClosure {
   393   BoolObjectClosure* _real_boc;
   381   BoolObjectClosure* _real_boc;